c - 为什么结构的大小不等于其各个成员类型的大小之和?

标签 c visual-c++ compiler-construction

<分区>

Possible Duplicate:
Why isn’t sizeof for a struct equal to the sum of sizeof of each member?

我想之前一定有人在 SO 上问过类似(重复)的问题。但是我找不到它们。基本上我不知道要搜索什么。所以在这里问一下。

为什么结构的大小不等于其各个成员类型的大小之和? 我正在使用 Visual C++ 编译器。

例如假设是32位机器。 {=> sizeof(int) == 4; sizeof(char) == 1; sizeof(短) == 2;

  struct {
      int k;
      char c;
  } s;

期望的大小是 4+1 = 5;但是 sizeof(s) 给出 8。这里 char 占用 4 个字节而不是 1 个字节。我不知 Prop 体原因,但我猜编译器这样做是为了提高效率。

struct{
 long long k;
 int i;
} s;

预期大小为 4+4 = 8(在 32 位机器上)和 8+4=12(在 64 位机器上)。但奇怪的是 sizeof(s) 给出了 16。这里 int 和 long long 都占用了 8 个字节。

  1. 这个东西叫什么?
  2. 到底发生了什么?
  3. 编译器为什么要这样做?
  4. 有没有办法告诉编译器停止这样做?

最佳答案

这是因为编译器使用填充将每个元素带入特定于您正在编译的体系结构的字对齐。

这可能是出于多种原因之一,但通常是:

  1. 因为某些 CPU 根本无法读取 long 或 long long 多字节值,当它不在其自身大小的倍数地址上时。

  2. 因为可以读取未对齐数据的 CPU 执行速度可能比对齐数据慢得多。

您通常可以使用特定于编译器的指令或编译指示强制关闭它。

当您这样做时,编译器将生成相对低效的代码来使用多个读/写操作来访问未对齐的数据。

关于c - 为什么结构的大小不等于其各个成员类型的大小之和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3366572/

相关文章:

c - linux c 程序 除了读取/var/log 中的文件之外,还有另一种读取日志的方法吗?

c++ - 如何检测 win32 上的数据卡连接和断开事件?

c++ - 将声明为 `extern char[]` 的变量传递给 VC++ 中的函数模板时出错

c++ - 启动在 VS6 中创建的旧程序时出现问题

visual-c++ - Visual C 内联汇编器中的立即调用/jmp

c++ - LLVM IR 生成的代码到 native 代码

c - C中的密码复杂度

c - 将 Int 和 Char 存储在全局数组中

c++ - 未优化表达式模板实现

hash - 如何缓存 AST 的哈希码?