缓冲区大小已更改
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 中流式传输的缓冲区大小?
如何在 gunicorn(django) + nginx + docker 中更改缓冲区大小