考虑:
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);
这两种语法是不同的还是严格等同的?是否所有这些都在编译时进行评估?如果不是,那么在运行时评估哪一个?
答案 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);
例如,如果您有时最终将a
从float
更改为双倍,则还需要将sizeof(float)
更改为sizeof(double)
才能匹配。如果您始终使用sizeof(a)
,当您将a
从float
更改为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
始终在编译时进行评估。
您提供的两组语法将返回相同的结果,但您不能说它们是等效的。但是,是的,后者是根据前者定义的。