建设网站哪些好,网站建设补贴是经信局的政策吗,网络营销外包平台,html5建设摄影网站意义最近遇到一个令我困惑的问题#xff0c;就是 sizeof#xff08;string#xff09;的值#xff0c;之前在vs2010上测得是固定28#xff0c;最近在用CLion#xff0c;上面测得是4#xff0c;出现了不一样的结果#xff0c;我又在vs2013上试了一下#xff0c;结果又不一样…最近遇到一个令我困惑的问题就是 sizeofstring的值之前在vs2010上测得是固定28最近在用CLion上面测得是4出现了不一样的结果我又在vs2013上试了一下结果又不一样在vs2013上是32.
查阅了相关资料得出结论string的实现在各库中可能有所不同但是在同一库中相同一点是无论你的string里放多长的字符串它的sizeof()都是固定的字符串所占的空间是从堆中动态分配的与sizeof()无关。 sizeof(string)4可能是最典型的实现之一不过也有sizeof()为28、32字节的库实现。 但是MS2015测试后sizeof(string)40.还是跟编译器有关.
也就是说sizeof(string)和字符串的长度是无关的在一个系统中所有的sizeof(string)是一个固定值这个和编译器相关string字符串是存储在堆上这个属于动态分配的空间对于别的整形浮点型数据类型则没有这个问题。
sizeof到底是什么
这个我们要看一下sizeof在msdn上的定义
The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.
看到return这个字眼是不是想到了函数错了sizeof不是一个函数sizeof可以不加括号所以sizeof不是函数。网上有人说sizeof是一元操作符但是我并不这么认为因为sizeof更像一个特殊的宏它是在编译阶段求值的。举个例子
coutsizeof(int)endl; // 32位机上int长度为4coutsizeof(12)endl; // 操作符返回bool类型相当于 coutsizeof(bool)endl;
在编译阶段已经被翻译为
cout4endl;cout1endl;
这里有个陷阱看下面的程序
int a 0;coutsizeof(a3)endl;coutaendl;
输出为什么是40 而不是期望中的43就在于sizeof在编译阶段处理的特性。由于sizeof不能被编译成机器码所以sizeof作用范围内也就是()里面的内容也不能被编译而是被替换成类型。操作符返回左操作数的类型所以a3相当于int而代码也被替换为
int a 0;cout4endl;coutaendl;
所以sizeof是不可能支持链式表达式的这也是和一元操作符不一样的地方。
结论不要把sizeof当成函数也不要看作一元操作符把他当成一个特殊的编译预处理。