美文网首页
更改C编译器的缺省字节对齐方式__align(),__attri

更改C编译器的缺省字节对齐方式__align(),__attri

作者: spfanlost | 来源:发表于2018-09-18 09:04 被阅读0次

在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变缺省的对界条件:

  1. 使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。
  2. 使用伪指令#pragma pack (),取消自定义字节对齐方式。

另外,还有如下的一种方式:

  1. __attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。
  2. attribute ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
    例子:
struct cmd1_
{
    uint32_t d1 = 11;
};
struct cmd2_
{
    uint8_t u8_d1 = 21;
    uint8_t u8_d2 = 22;
    uint16_t u16_d3 = 23;
    uint32_t u32_d4 = 24;
    uint64_t u64_d5 = 25;
    uint64_t u64_d6 = 26;
    uint32_t u32_d7 = 27;
    uint32_t u32_d8 = 28;
};
struct fw_cmd_
{
    struct cmd1_ cmd1;
    struct cmd2_ cmd2;
    
};
struct fw_cmd_ fw_cmd;

猜猜sizeof(fw_cmd)=? 应该是4+1+1+2+4+8+8+4+4 = 36实际:



强制按4字节对齐:

#include <iostream>
#include <stdint.h>
#pragma pack(4)
struct cmd1_
{
    uint32_t d1 = 11;
};
struct cmd2_
{
    uint8_t u8_d1 = 21;
    uint8_t u8_d2 = 22;
    uint16_t u16_d3 = 23;
    uint32_t u32_d4 = 24;
    uint64_t u64_d5 = 25;
    uint64_t u64_d6 = 26;
    uint32_t u32_d7 = 27;
    uint32_t u32_d8 = 28;
};
struct fw_cmd_
{
    struct cmd1_ cmd1;
    struct cmd2_ cmd2;
};
int main(int argc, char** argv)
{
    struct fw_cmd_ fw_cmd;
    printf("sizeof(uint8_t):%d\r\n", sizeof(uint8_t));
    printf("sizeof(uint16_t):%d\r\n", sizeof(uint16_t));
    printf("sizeof(uint32_t):%d\r\n", sizeof(uint32_t));
    printf("sizeof(uint64_t):%d\r\n", sizeof(uint64_t));
    printf("sizeof(fw_cmd):%d\r\n", sizeof(fw_cmd));
    return 0;
}

输出:


相关文章

  • 更改C编译器的缺省字节对齐方式__align(),__attri

    在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变缺省的对界...

  • sizeof与字节对齐

    参考 【面试题】sizeof引发的血案编译器与字节对齐c 语言字节对齐问题详解C/C++内存对齐内存存取粒度C和C...

  • 字节对齐align

    关于对齐的问题,我们经常在运行程序的时候出现对齐异常,面试官也特别热衷于纠结字节对齐的问题,因此,记于此,解惑之。...

  • CSS常见样式-下

    text-align text-align 属性规定元素中的文本的水平对齐方式可能的值 text-align: c...

  • instanceSize

    alignedInstanceSize() word_align:字节对齐:(x + WORD_MASK) & ~...

  • #pragma pack(push,1)与#pragma pac

    这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式。 #...

  • #pragma pack&pop

    转这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式。 ...

  • 字节对齐与大端小端与内存区域划分

    字节对齐 C语言字节对齐C语言字节对齐/7213465 大端小端 字节序(大小端)详解从高低地址和高低位开始理解(...

  • 文本

    文本 text text-align: 文本对齐方式left 左对齐center ...

  • css样式总结

    1.对齐方式 1.1 文本对齐水平方式 text-align 控制容器里面文本的水平对齐方式值: left ...

网友评论

      本文标题:更改C编译器的缺省字节对齐方式__align(),__attri

      本文链接:https://www.haomeiwen.com/subject/mcfynftx.html