【发布时间】:2015-02-14 20:48:32
【问题描述】:
我知道在 C++ 中 sizeof(char) 保证为 1,但它是唯一的情况,还是有任何其他内置类型保证具有精确的大小?
特别是sizeof(bool) == 1 或sizeof(int) == 4 是语言要求的还是实现细节?
【问题讨论】:
-
有保证的最小值,但没有其他保证的绝对值。
标签: c++
我知道在 C++ 中 sizeof(char) 保证为 1,但它是唯一的情况,还是有任何其他内置类型保证具有精确的大小?
特别是sizeof(bool) == 1 或sizeof(int) == 4 是语言要求的还是实现细节?
【问题讨论】:
标签: c++
只有char: sizeof(char) == 1 才明确保证大小。隐含地,此保证也适用于signed char 和unsigned char,因为其中一个需要使用与char 相同的表示,另一个受signed char 和unsigned char 之间的转换规则的约束以使用相同的大小.
除此之外,仅保证某些类型中存在位的数量以及某些类型之间的大小关系。请注意,char 的位数可以等于或大于 8。
【讨论】:
<cstdint>
规则足够严格,signed char 和 unsigned char 的大小也必须为 1。
没有其他类型可以保证大小 - 我知道编译器使 sizeof(bool) 的值大于 1,并使 sizeof(int) 的值不是 4。
【讨论】:
std::int32_t、std::int64_t 和 std::int128_t 这样的类型呢?我确定那些是固定大小的数据类型。你应该提到那些。
sizeof 的结果却不是。例如,您可以有 8 位字节,并且 sizeof(int32_t) == 4。或者您可以有 16 位字节,并且 sizeof(int32_t) == 2。或者您可以有 32 位字节,并且 sizeof( int32_t) == 1.
类型不一定保证在架构中总是具有相同的字节大小。 sizeof(X) 实际上由编译器实现并输出一个整数(1、2、4、8 等),因此不是函数调用。因此,给定类型(例如 int)的输出将取决于编译应用程序的系统。这就是为什么您必须为不同的架构重新编译应用程序的原因。
也就是说,某些类型始终是特定大小(例如 int32)。
见:What does the C++ standard state the size of int, long type to be?
【讨论】:
int32 不是类型。
理论上,一个(旧 C++)实现(但可能不是 C++11)可能有 sizeof 每个标量类型(数字、指针、布尔值)为 1。但我无法命名这样的实现(其中 @987654327 @、sizeof(double)、sizeof(long long)、sizeof(bool)、sizeof(void*) 都是 1)。
如果您关心数据类型的大小,您可能应该使用 <cstdint> 标头。
另外,代码portability 可能很棘手。您不仅应该关心整数数据类型的大小,还应该关心endianess 和操作系统问题(POSIX 等标准应该会有所帮助)。一句格言说没有可移植的软件,只有痛苦移植的代码。
【讨论】:
sizeof(X) == 1。它只能寻址 64 位字。不过,它早于 C++ 标准。另一方面,内置类型的规则继承自 C,Cray X-MP 有一个 C 编译器。
sizeof(char*) 不同于 sizeof(int*)