运算符sizeof()
返回给定类型或对象的大小(以字节为单位)。“类型版本”很容易理解,但使用“对象版本”你需要记住一件事:
sizeof()
仅查看类型定义并从其成员的大小和数量推导出总大小(通常,多态和多个继承的类型可能有额外的“隐藏”成员)。
换句话说,假设我们有:
struct A
{
int* p1;
char* p2;
};
您可能会怀疑,sizeof(A)
将返回 8(因为指针在大多数 32 位系统上是 4 字节类型)。但是,当你做这样的事情时:
A a_1;
a_1.p1 = new int[64];
sizeof(a_1)
仍将返回 8。这是因为由 new 分配并由 A 的成员指向的内存不“属于”该对象。
这就是为什么sizeof(str)
并str.length()
给出不同的结果。std::string
为堆上的字符分配内存(动态地,通过malloc()
),所以它不会改变字符串的大小。
因此,如果您想通过网络发送字符串,则str.len()
可以通过调用来检索适当的大小和数据指针str.c_str()
。
我不理解“strlen(str)
等价物”。在 C++ 中,也有strlen()
函数,具有相同的原型,以完全相同的方式工作。它只需要const char*
,因此您不能将其用于std::string
(但您可以这样做strlen(str.c_str())
,因为std::string
' 的内部字符串保证以空值结尾)。像你已经做的那样std::string
使用。.length()