什么是sizeof()运算符在C ++中做什么

时间:2014-07-24 19:11:46

标签: c++ stl sizeof

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()运营商应该知道。

2 个答案:

答案 0 :(得分:5)

根据问题1 sizeof由编译器实现和评估。它不是宏,它总是提供编译时结果。从概念上讲,您可以想象编译器会用数字替换每个sizeof

根据问题2 sizeof计算一个S实例占用的存储量。方法不采用每实例存储,只采用字段(因为它们每个实例存在一次)。但是,方法会在某处占用静态存储空间来保存函数的机器代码。

根据问题3 :对于sizeof(vector<int>),编译器会计算vector<int>的大小,并将其实例化。如果您感到困惑,因为vector可以是可变大小:这是真的,但额外的存储是从堆中分配的,因此不会反映在应用于sizeof的{​​{1}}的结果中}。

答案 1 :(得分:5)

  1. sizeof不是宏。它是一个内置运算符并产生一个常量表达式,因此您可以想象编译器只是在编译时用一个文字替换它,该文字的值是对象或类操作数的大小。

  2. 函数不会占用对象内的空间。函数的代码不存储在对象中。

  3. 容器的大小(如std::vector<int>)是向量成员占用的内存量,加上一些实现定义的填充。它不包含向量通过保持指针“拥有”的任何内存。 (注意,向量的元素是不是成员---当我说成员时我指的是在std::vector类的定义中声明的成员。)所以它与多少元素无关在矢量内。