缓冲区大小已更改

Posted

技术标签:

【中文标题】缓冲区大小已更改【英文标题】:buffer size changed 【发布时间】:2012-04-08 15:22:54 【问题描述】:

我正在套接字之间进行简单的通信,这是我的 C++ 代码

while(1)

    string buffer = "23,45\n";
    const char* foo = buffer.c_str();
    cout << "size of buffer is " << sizeof(buffer)<<endl;
    send (s, foo, sizeof(buffer), 0);

奇怪的是第一次迭代,缓冲区的大小如预期的那样是 5,但是自从第二次迭代之后,大小急剧上升到 32。知道为什么吗?非常感谢你。顺便说一句,增加的大小来自前导 while 空格。

【问题讨论】:

为什么不直接使用buffer.size(),就像使用string 时一样? sizeof(buffer) 返回buffer 对象的大小,与它所包含的字符串长度不同。 看这里>>cplusplus.com/forum/beginner/24922 @Joachim 我是 C++ 新手,但没有 string buffer = "23,45\n"; 已经将字符串对象的长度固定为 6它会在Java中吗?还是 C++ 中字符串对象的大小总是 32?谢谢 @Clint, no in C++ string 对象不是只读的,因为它们在 Java 中。它们可以调整大小、变异等。因此字符串的长度仅在运行时可用。 【参考方案1】:

sizeof 运算符返回对象的大小(以字节为单位)。它返回容器类型的长度。您需要使用std::string::length()std::string::size() 来确定字符串的长度。

【讨论】:

谢谢,如果没有提示,您可能无法注意到差异。【参考方案2】:

我认为您误解了第一次迭代中的 5:它一定来自其他地方。 sizeof(buffer) 是在编译时计算出来的 - 它是 std::string 的大小,所以你应该在每次迭代中看到 32。

如果您要查找字符串的长度,请改用buffer.size()

【讨论】:

【参考方案3】:

sizeof(buffer) 告诉您 std::string 对象的大小,这与您存储在其中的字符数无关(顺便说一下,在您的示例中是 7,而不是 5)。

【讨论】:

字符串的长度为6,因为结束的'\0'不计算在内。 @JoachimPileborg: 有办法说它是 6,是的,我给你这个(对我来说,buffer 的大小是缓冲区的大小,而不是它持有的字符串)。但是,它绝不是 5。

以上是关于缓冲区大小已更改的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 android videoview 中流式传输的缓冲区大小?

更改缓冲区大小以在 C 中复制文件

在 Windows 下更改默认套接字缓冲区大小 [关闭]

如何在 gunicorn(django) + nginx + docker 中更改缓冲区大小

更改与 HDC 关联的位图大小后,有没有办法更新 Graphics 对象?

如何在 Spring 5 webflux websocket 客户端上更改帧/缓冲区大小