运算符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()