C中的sizeof()
运算符在编译时给出其操作数的大小。它不评估其操作数。例如,
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
我猜矢量或其他STL容器上的sizeof
取决于特定的环境。
问题1。如何在C / C ++中实现sizeof
?它不能是运行时功能。这是一个宏吗? (我在在线教程vedio中学到的东西)。如果是宏,它的#define
是什么样的?执行sizeof()
时
问题2。如果我将成员方法void f(){}
添加到struct S
的定义中。 sizeof(S<int>)
仍然是4.结构的大小不应该增加吗?
问题3。 STL容器是模板类。以vector
为例,它有12个成员属性/类型和许多成员方法?很容易解释sizeof( S<int> )
的输出。但我发现很难解释sizeof( vector<int> )
的输出。模板类应该在编译时实例化,编译器应该完全了解类的大小,即vector<int>
。 sizeof()
运营商应该知道。
答案 0 :(得分:5)
根据问题1 :sizeof
由编译器实现和评估。它不是宏,它总是提供编译时结果。从概念上讲,您可以想象编译器会用数字替换每个sizeof
。
根据问题2 :sizeof
计算一个S
实例占用的存储量。方法不采用每实例存储,只采用字段(因为它们每个实例存在一次)。但是,方法会在某处占用静态存储空间来保存函数的机器代码。
根据问题3 :对于sizeof(vector<int>)
,编译器会计算vector<int>
的大小,并将其实例化。如果您感到困惑,因为vector
可以是可变大小:这是真的,但额外的存储是从堆中分配的,因此不会反映在应用于sizeof
的{{1}}的结果中}。
答案 1 :(得分:5)
sizeof
不是宏。它是一个内置运算符并产生一个常量表达式,因此您可以想象编译器只是在编译时用一个文字替换它,该文字的值是对象或类操作数的大小。
函数不会占用对象内的空间。函数的代码不存储在对象中。
容器的大小(如std::vector<int>
)是向量成员占用的内存量,加上一些实现定义的填充。它不包含向量通过保持指针“拥有”的任何内存。 (注意,向量的元素是不是成员---当我说成员时我指的是在std::vector
类的定义中声明的成员。)所以它与多少元素无关在矢量内。