8

考虑:

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);

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

4

3 回答 3

24

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

从语法上讲,您可以在一种情况下省略括号,但不能在另一种情况下:

double d;

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

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

float a;

x = sizeof(float);

y = sizeof(a);

例如,如果您最终a从 a更改float为 double,则还需要更改sizeof(float)sizeof(double)以匹配。如果您sizeof(a)始终使用,当您a从 a更改为floata时double,您的所有用法sizeof也会自动更改,无需任何编辑。后者在 C 中比在 C++ 中更经常出现问题,例如在调用 malloc 时:

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

对比

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

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

于 2012-10-10T04:07:55.367 回答
2

无论何时使用sizeof(<whatever>),它总是在编译时进行评估。它是所sizeof关注的参数的数据类型。

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

您也可以将表达式作为sizeof(x = x+1);. 说x是int。在这种情况下,这sizeof将返回4(就像在我的机器上一样)并且 x 的值将保持不变。这是因为sizeof总是在编译时进行评估。

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

于 2012-10-10T04:21:50.590 回答
2

后者是根据前者定义的。给定一个表达式,它返回表达式类型的大小。所以sizeof(vec)翻译为sizeof(std::vector<int>).

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

我更喜欢使用表达式而不是类型,因为很可能会以某种方式说明类型是多余的。

于 2012-10-10T04:04:59.597 回答