Dose 编译器总是将结构放在对齐的地址中?

问题描述 投票:0回答:1

假设我有结构:

typedef struct my_char {
    char c;
} my_char_t;

我可以假设任何时候内存地址都会对齐吗?

我想也许是的,因为在教程中我看到了这样的结构:

typedef struct my_char2 {
    char c;
    int i;
} my_char2_t;

c
i
之间有填充,所以它似乎假设
c
是对齐的

c struct memory-alignment
1个回答
1
投票

通过普通方式(例如使用定义对象的声明或使用

malloc
分配空间)在 C 中创建的任何对象都将具有 C 实现对该对象要求的对齐方式。

struct my_char { char c; }
的对齐要求通常只是一个字节,因为该结构只包含一个具有一字节对齐要求的成员。结构的对齐要求通常是其成员最严格的对齐要求,因此
struct { char c; }
具有一个字节的要求,而
struct { char c; int i; }
具有与
int
相同的对齐要求,在现代 C 实现中通常为四个字节.

© www.soinside.com 2019 - 2024. All rights reserved.