在sizeof()
用C经营者给其操作数在编译时的大小。它不评估其操作数。例如,
int ar1[10];
sizeof(ar1) // output 40=10*4
sizeof(ar1[-1]) // output 4
int ar2[ sizeof(ar1) ]; // generate an array of 40 ints.
当涉及到C ++模板类时,我发现了一些奇怪的结果。
template<typename T>
struct S{
T a;
};
sizeof( S<int> ) // output 4
sizeof( S<bool> ) // output 1
sizeof( vector<int> ) // output 24
sizeof( vector<char> ) // output 24
sizeof( vector<bool> ) // output 40
我猜sizeof
on或其他STL容器取决于特定的环境。
问题1.如何sizeof
在C / C ++中实现?它不能是运行时函数。是宏吗?(我在在线教学视频中学到了什么)。如果它是一个宏,#define
它看起来像什么?什么时候sizeof()
执行?
问题2.如果我将成员方法添加void f(){}
到的定义struct S
。将sizeof(S<int>)
仍然是4。不应该增加结构的大小?
问题3. STL容器是模板类。就拿vector
例如,它有12个成员的属性/类型的许多成员方法?很容易解释的输出sizeof( S<int> )
。但是我发现很难解释的输出sizeof( vector<int> )
。模板类应在编译时实例化,并且编译器应完全了解类的大小,即vector<int>
。因此sizeof()
操作员应该知道。
按照问题1:sizeof
由编译器实现和评估。它不是宏,并且始终提供编译时结果。从概念上讲,您可以想象编译器用sizeof
数字替换每个数字。
根据问题2:sizeof
计算一个实例S
占用的存储量。方法不按实例存储,而仅按字段存储(因为每个实例存在一次)。但是,方法确实会在某处占用静态存储空间以保存该功能的机器代码。
按照问题3:对于sizeof(vector<int>)
编译器,计算vector<int>
实例化的大小。如果您因为avector
可以是可变大小而感到困惑:是的,那是多余的存储空间是从堆分配的,因此不会反映在sizeof
应用于a的结果中vector
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句