【问题标题】:Is sizeof any type other than char guaranteed?sizeof 是否保证 char 以外的任何类型?
【发布时间】:2015-02-14 20:48:32
【问题描述】:

我知道在 C++ 中 sizeof(char) 保证为 1,但它是唯一的情况,还是有任何其他内置类型保证具有精确的大小?

特别是sizeof(bool) == 1sizeof(int) == 4 是语言要求的还是实现细节?

【问题讨论】:

标签: c++


【解决方案1】:

只有char: sizeof(char) == 1 才明确保证大小。隐含地,此保证也适用于signed charunsigned char,因为其中一个需要使用与char 相同的表示,另一个受signed charunsigned char 之间的转换规则的约束以使用相同的大小.

除此之外,仅保证某些类型中存在位的数量以及某些类型之间的大小关系。请注意,char 的位数可以等于或大于 8。

【讨论】:

  • 我还会添加可通过某些 C 编译器获得的 int32、int64 等类型。顾名思义,这些应该保证固定的位长度。
  • @JoshJ:我想你的意思是<cstdint>
【解决方案2】:

规则足够严格,signed charunsigned char 的大小也必须为 1。

没有其他类型可以保证大小 - 我知道编译器使 sizeof(bool) 的值大于 1,并使 sizeof(int) 的值不是 4。

【讨论】:

  • 但是像 std::int32_tstd::int64_tstd::int128_t 这样的类型呢?我确定那些是固定大小的数据类型。你应该提到那些。
  • @Brandon:它们甚至可能不存在,虽然它们的 bits 大小是有保证的,但在它们上使用sizeof 的结果却不是。例如,您可以有 8 位字节,并且 sizeof(int32_t) == 4。或者您可以有 16 位字节,并且 sizeof(int32_t) == 2。或者您可以有 32 位字节,并且 sizeof( int32_t) == 1.
  • Wth.. 该死的,这绝对是可怕的.. 哈哈。可憎之物。幸运的是,到目前为止,我从未遇到过这样的系统..
【解决方案3】:

类型不一定保证在架构中总是具有相同的字节大小。 sizeof(X) 实际上由编译器实现并输出一个整数(1、2、4、8 等),因此不是函数调用。因此,给定类型(例如 int)的输出将取决于编译应用程序的系统。这就是为什么您必须为不同的架构重新编译应用程序的原因。

也就是说,某些类型始终是特定大小(例如 int32)。

见:What does the C++ standard state the size of int, long type to be?

【讨论】:

【解决方案4】:

理论上,一个(旧 C++)实现(但可能不是 C++11)可能有 sizeof 每个标量类型(数字、指针、布尔值)为 1。但我无法命名这样的实现(其中 @987654327 @、sizeof(double)sizeof(long long)sizeof(bool)sizeof(void*) 都是 1)。

如果您关心数据类型的大小,您可能应该使用 <cstdint> 标头。

另外,代码portability 可能很棘手。您不仅应该关心整数数据类型的大小,还应该关心endianess 和操作系统问题(POSIX 等标准应该会有所帮助)。一句格言说没有可移植的软件,只有痛苦移植的代码

【讨论】:

  • 过去Cray X-MP 对所有内置类型都有sizeof(X) == 1。它只能寻址 64 位字。不过,它早于 C++ 标准。另一方面,内置类型的规则继承自 C,Cray X-MP 有一个 C 编译器。
  • 我记得在 Cray-s 上编写了一点代码(将 Ocaml 解释器移植到他们身上)。 IIRC sizeof(char*) 不同于 sizeof(int*)
猜你喜欢
  • 2015-02-12
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 2012-11-22
  • 2012-05-22
相关资源
最近更新 更多