sizeof(value)vs sizeof(type)?

时间:2012-10-10 03:52:49

标签: c++ runtime sizeof compile-time

考虑:

double data; 
double array[10]; 
std::vector<int> vec(4, 100); 
MyClass myclass;   

之间是否存在差异:

sizeof(double);
sizeof(double[10]);
sizeof(std::vector<int>);
sizeof(MyClass);

sizeof(data);
sizeof(array);
sizeof(vec);
sizeof(myclass);

这两种语法是不同的还是严格等同的?是否所有这些都在编译时进行评估?如果不是,那么在运行时评估哪一个?

3 个答案:

答案 0 :(得分:18)

唯一的区别在于语法和便利性。

从句法上讲,你可以在一个案例中省略括号,但不能忽略另一个案例:

double d;

sizeof(double); // compiles
sizeof(d);      // compiles
sizeof d;       // compiles
sizeof double;  // does NOT compile

就方便而言,请考虑以下内容:

float a;

x = sizeof(float);

y = sizeof(a);

例如,如果您有时最终将afloat更改为双倍,则还需要将sizeof(float)更改为sizeof(double)才能匹配。如果您始终使用sizeof(a),当您将afloat更改为double时,sizeof的所有使用都将自动更改,而不进行任何编辑。后者在C中比C ++更常出现问题,例如在调用malloc:

float *a = malloc(10 * sizeof(float));

VS。

float *a = malloc(10 * sizeof(*a));

在第一种情况下,将第一个float更改为double将生成编译的代码,但缓冲区溢出。在第二种情况下,将(仅)float更改为double可以正常工作。

答案 1 :(得分:2)

后者是根据前者定义的。给定一个表达式,它返回表达式类型的大小。因此sizeof(vec)会转换为sizeof(std::vector<int>)

两者都在编译时进行评估;唯一的运行时sizeof在C中,而不是C ++,具有可变长度数组。 sizeof的操作数未被评估,因此表达式本身可能无论如何都无法生成代码。

我更喜欢在类型上使用表达式,因为很有可能说明类型在某种程度上是多余的。

答案 2 :(得分:2)

每当使用sizeof(<whatever>)时,始终在编译时对其进行评估。它是sizeof关注的参数的数据类型。

但是,您可以将值,甚至表达式作为参数传递。但sizeof函数只会考虑传递参数的dataype。

您还可以将表达式传递为sizeof(x = x+1);。说x是int。在这种情况下,sizeof将返回4(在我的机器上),x的值将保持不变。这是因为sizeof始终在编译时进行评估。

您提供的两组语法将返回相同的结果,但您不能说它们是等效的。但是,是的,后者是根据前者定义的。