【发布时间】:2015-11-09 17:04:21
【问题描述】:
在 GCC C 中,我如何获得一个压缩结构数组,其中数组中的每个条目都是对齐的?
(FWIW,这是在 PIC32 上,使用 MIPS4000 架构)。
我有这个(简化):
typedef struct __attribute__((packed))
{
uint8_t frameLength;
unsigned frameType :3;
uint8_t payloadBytes;
uint8_t payload[RADIO_RX_PAYLOAD_WORST];
} RADIO_PACKET;
RADIO_PACKET 在内部打包。
然后我有 RADIO_PACKET_QUEUE,这是一个 RADIO_PACKET 队列:
typedef struct
{
short read; // next buffer to read
short write; // next buffer to write
short count; // number of packets stored in q
short buffers; // number of buffers allocated in q
RADIO_PACKET q[RADIO_RX_PACKET_BUFFERS];
} RADIO_PACKET_QUEUE;
我希望数组 q[] 中的每个 RADIO_PACKET 从对齐的地址(模 4 地址)开始。
但是现在 GCC 没有对齐它们,所以当我尝试将 q[n] 读取为一个单词时会出现地址异常。例如,这给出了一个例外:
RADIO_PACKET_QUEUE rpq;
int foo = *(int*) &(rpq.q[1]);
这可能是因为我将 RADIO_PACKET 声明为已打包的方式。
我希望每个 RADIO_PACKET 在内部保持打包,但希望 GCC 在每个数组元素之后根据需要添加填充,以便每个 RADIO_PACKET 从对齐的地址开始。
我该怎么做?
【问题讨论】:
-
C 要求数组由 连续 对象序列组成。
-
当出现错位问题时,为什么要将
RADIO_PACKET声明为已打包?您确实意识到打包结构在禁止未对齐内存访问的平台上不是很有用,因为打包结构的成员未对齐? -
@nerdfever.com 你可以先让
RADIO_PACKET不打包。你知道打包申报是什么意思吗? (提示:它告诉编译器省略任何填充)。 -
@nerdfever.com:似乎“我想要填充”和“我想要它打包”是两个根本不相容的愿望。如果您也想打包,请显式添加您自己的填充。
-
您可以声明包装 RADIO-PACKET 的结构并保持它不对齐。然后你做这个新结构的数组。