C 中结构体中 __attribute__((aligned(4), Packed)) 的用法

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

我想使用该结构来存储一些数据,然后通过DMA传输它。然而,外设的具体情况要求结构的初始地址沿 4 字节边界对齐。我不明白为什么在不同的地方使用对齐属性会导致打包结构的大小调整1个字节。

我写了一个简单的例子来代表这种情况。

#include <stdio.h>
#include "stdint.h"

// Version with aligned attribute
struct packet_v1 
{
    uint8_t uid;
    uint8_t flag;
    uint8_t comm;
    uint32_t a;
    
} __attribute__((packed, aligned(4)));

// Version without alignment 
struct packet_v2
{
    uint8_t uid;
    uint8_t flag;
    uint8_t comm;
    uint32_t a;
    
} __attribute__((packed));


struct packet_v1 pkt1;
struct packet_v2 pkt2 __attribute__((aligned(4)));


int main()
{
    printf("Align v1: %lu, size: %lu\r\n", (uintptr_t)&pkt1 % 4, sizeof(pkt1));
    printf("Align v2: %lu, size: %lu\r\n", (uintptr_t)&pkt2 % 4, sizeof(pkt2));
    
    return 0;
}

输出:

Align v1: 0, size: 8
Align v2: 0, size: 7
c struct attributes compiler-optimization
1个回答
0
投票

struct_v1
末尾有一个填充字节,因此结构数组的每个元素将按照
aligned(4)
的要求与 4 字节边界对齐。

struct_v2
没有填充字节,因此结构数组将尽可能紧密地打包在一起。无需将每个数组元素对齐相同。

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