为什么 sizeof() 不打印 16 个字节而不是 8 个字节?

Why isn't sizeof() printing 16 bytes instead of 8?

非常简单的程序,我只是在测试 sizeof() 函数并尝试查看它是否有效。如果 sizeof() 真的用位来做 return 事情,当我有这两个元素时,它不应该 return 16 而不是 8 吗?因为 long long 在 C++ 中是 8 个字节,而我有两个元素?


int main()
{
    long long whatever[] = {0};
    std::cout << whatever[0] << std::endl;
    whatever[2] = 10;

    std::cout << "The size of this array is " << sizeof(whatever[0] + whatever[2]) << std::endl;
}

这是未定义的行为

long long whatever[] = {0};
std::cout << whatever[0] << std::endl;
whatever[2] = 10;  // BAD

代码将 whatever 静态初始化为一个元素的数组。然后你给 whatever[2] 赋值。该数组中唯一有效的索引是 0。将任何内容分配给索引 12 会覆盖堆栈上的重要内容或做其他邪恶的事情。

你的意思可能是:

long long whatever[2] = {0};
std::cout << whatever[0] << std::endl;
whatever[1] = 10; 

std::cout << "The size of this array is " << sizeof(whatever) << std::endl;

您测量的不是数组的大小,而是两个 long long 之和的大小。即,

sizeof(whatever[0] + whatever[2])

基本相同
sizeof(long long)

你指出的是 8。

您声明了一个只有一个元素的数组。所以这个数组的有效索引是0。因此在这个表达式中使用等于2的值作为索引值

whatever[2] = 10;

导致访问超出调用未定义行为的数组的内存。

至于运算符 sizeof 那么它不会评估其操作数。它只确定其操作数的类型和 returns 这种类型的对象的大小。

所以这个表达式

sizeof(whatever[0] + whatever[2])

其中您可以为数组使用无效索引 whatever 等同于表达式

sizeof( long long )

来自 C++ 14 标准 (5.3.3 Sizeof)

1 The sizeof operator yields the number of bytes in the object representation of its operand. The operand is either an expression, which is an unevaluated operand (Clause 5), or a parenthesized type-id.