c ++ sizeof - 需要帮助理解

c++ sizeof - need help understanding

我无法理解一行代码。我看到一个数组被初始化如下:

static const uint SmartBatteryWattHoursTable[1 << 4] = {
  0,  14,  27,  41,  54,  68,  86, 104,
120, 150, 180, 210, 240, 270, 300, 330};

但是我看不懂下面的代码是什么意思:

int x  = sizeof(SmartBatteryWattHoursTable) / sizeof(*SmartBatteryWattHoursTable));

我知道分子的计算结果是 16 * 4 = 64。但是分母的计算结果是什么?

But what does the denominator evaluate to?

sizeof(*SmartBatteryWattHoursTable) 计算出表达式类型的大小 *SmartBatteryWattHoursTable。该表达式的类型与数组的元素相同,即 uint.

换句话说,sizeof(SmartBatteryWattHoursTable) / sizeof(*SmartBatteryWattHoursTable)) 是一种以元素数量计算数组大小的方法(与分子的字节数大小相对)。

更简单的写法是std::size(SmartBatteryWattHoursTable)

代码正在声明一个包含 16 (1 << 4) uint 个值的数组。

声明sizeof(SmartBatteryWattHoursTable)returns整个数组的字节大小,因此sizeof(uint) * 16 = 64(假设是4字节uint)。

数组 decays 指向第一个元素的指针,因此 *SmartBatteryWattHoursTable*(&SmartBatteryWattHoursTable[0]) 相同。所以语句 sizeof(*SmartBatteryWattHoursTable) returns 数组第一个元素的字节大小,即单个 uint,因此 4.

这样,x就设置为64 / 4 = 16,即数组的元素个数。

这是在 C++17 中将 std::size() 添加到标准 C++ 库(以及 C 中的 std::ssize() 之前,获取固定数组元素大小的一种非常常用的方法++20).