当前位置:  开发笔记 > 程序员 > 正文

C结构填充问题

如何解决《C结构填充问题》经验,为你挑选了1个好方法。

不是一个安全的操作.编译器将以实现定义的方式添加填充.

一般而言,给定大小的成员将在偏移上对齐,该偏移是该大小的倍数.

给定填充的典型方式,这struct很可能是16字节大小.物理布局很可能(但不一定)看起来像这样:

struct something {
    uint32_t a;         // offset 0
    uint8_t  b;         // offset 4
                        // 1 byte padding
    uint16_t c;         // offset 6
    uint32_t x;         // offset 8
    uint16_t y;         // offset 12
    uint8_t  z;         // offset 14
    // 1 byte padding
};

不要使用魔术数字.Intead,使用sizeof运算符.

struct something *s = malloc(sizeof(struct something));

编辑:

如果您想增加struct以特定方式布置的机会,请参阅本指南以了解结构包装.如果你遵循这里的做法,你很有可能(但不是100%)将你的struct意志按照你期望的方式安排在记忆中.

对于gcc,您可以使用__attribute__((packed))a struct来删除a 中的填充struct.但是,这样做可能会导致性能下降或导致页面错误.该-Wpadded-Wpacked选项还可以告诉你更多关于填充.



1> dbush..:

不是一个安全的操作.编译器将以实现定义的方式添加填充.

一般而言,给定大小的成员将在偏移上对齐,该偏移是该大小的倍数.

给定填充的典型方式,这struct很可能是16字节大小.物理布局很可能(但不一定)看起来像这样:

struct something {
    uint32_t a;         // offset 0
    uint8_t  b;         // offset 4
                        // 1 byte padding
    uint16_t c;         // offset 6
    uint32_t x;         // offset 8
    uint16_t y;         // offset 12
    uint8_t  z;         // offset 14
    // 1 byte padding
};

不要使用魔术数字.Intead,使用sizeof运算符.

struct something *s = malloc(sizeof(struct something));

编辑:

如果您想增加struct以特定方式布置的机会,请参阅本指南以了解结构包装.如果你遵循这里的做法,你很有可能(但不是100%)将你的struct意志按照你期望的方式安排在记忆中.

对于gcc,您可以使用__attribute__((packed))a struct来删除a 中的填充struct.但是,这样做可能会导致性能下降或导致页面错误.该-Wpadded-Wpacked选项还可以告诉你更多关于填充.

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有