【问题标题】:int shown as to take 8 bytes [duplicate]int 显示为占用 8 个字节 [重复]
【发布时间】:2019-03-01 07:40:59
【问题描述】:

我已从https://www.geeksforgeeks.org/the-offsetof-macro/ 获取代码。

我在 gfg 本身提供的 ide 中运行代码。

我对代码进行了一些编辑,sizeof(int) 显示为 4,但显示通过偏移量在 struct 中占用 8 个字节

#include <stdio.h> 

#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT)) 

typedef struct PodTag 
{ 
    int   i; 
    double d; 
    char  c; 
} PodType; 

int main() 
{ 
    printf("%ld", OFFSETOF(PodType, d) ); 

    getchar(); 
    return 0; 
} 

【问题讨论】:

  • 你的操作系统/架构是什么?
  • 它没有。问题是 double 成员,它需要对齐到 8。因此编译器需要使用 4 个字节的未使用空间(也称为填充)。填充也添加到结构的末尾,因此当在数组中使用结构时,双精度仍然与 8 对齐。谷歌“c 结构成员对齐”以了解更多信息。
  • 什么是 OFFSETOF 宏?那不可能编译。您正在将 0 转换为 PodType 类型的结构的地址。
  • 你不应该发明这样无用的宏。 offsetof 是标准的一部分。您链接的教程网站声誉不佳,我不建议使用它。

标签: c++ c language-lawyer


【解决方案1】:

下一个字段d 需要8 字节对齐。这意味着在字段之间插入了 4 个填充字节。

在其他架构上可能会有所不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-30
    • 2014-11-24
    • 2013-12-11
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    相关资源
    最近更新 更多