No Memory Alignment with GCC

  1. attribute method:

    #include <stdio.h>
    
    struct packed
    {
        char a;
        int b;
    } __attribute__((packed));
    
    struct not_packed
    {
        char a;
        int b;
    };
    
    int main(void)
    {
        printf("Packed:     %zu\n", sizeof(struct packed));
        printf("Not Packed: %zu\n", sizeof(struct not_packed));
        return 0;
    }

    Output:

    $ make example && ./example
    cc     example.c   -o example
    Packed:     5
    Not Packed: 8
  1. pragma pack method:

    #include <stdio.h>
    
    #pragma pack(1)
    struct packed
    {
        char a;
        int b;
    };
    #pragma pack()
    
    struct not_packed
    {
        char a;
        int b;
    };
    
    int main(void)
    {
        printf("Packed:     %zu\n", sizeof(struct packed));
        printf("Not Packed: %zu\n", sizeof(struct not_packed));
        return 0;
    }

    Output:

    $ make example && ./example
    cc     example.c   -o example
    Packed:     5
    Not Packed: 8
  2. Add -fpack-struct to GCC
    -fpack-struct[=n]
    Without a value specified, pack all structure members together without holes. When a value is specified (which must be a small power of two), pack structuremembers according to this value, representing the maximum alignment (that is, objects with default
    alignment requirements larger than this will be outputpotentially unaligned at the next fitting location.

    Warning: the -fpack-struct switch causes
    GCC to generate code that is not binary compatible with code generated without thatswitch. Additionally, it makes the code suboptimal. Use it to conform to a non-default application binary interface.

No Memory Alignment with GCC

时间: 2024-10-11 00:31:28

No Memory Alignment with GCC的相关文章

还是说Memory Model,gcc的__sync_synchronize真是太坑爹了

还是说Memory Model,gcc的__sync_synchronize真是太坑爹了! 时间 2012-01-29 03:18:35  IT牛人博客聚合网站 原文  http://www.udpwork.com/item/6751.html 主题 GCC 嗯,还是说可见性的问题.由于CPU和编译器的乱序执行功能,我们经常不得不在代码中手动插入memory barrier.如果你还不清楚memory barrier是什么,那么请先读这个 http://en.wikipedia.org/wiki

memory alignment

memory-alignment Table of Contents 1. Conclusion 2. Test Program 3. Memory Alignment in ubuntu14.04 i386 3.1. kernel version 3.2. result 4. Memory Alignment in Arm DM368 4.1. kernel version 4.2. result 1 Conclusion Make sure memory alignment by 4 byt

从硬件到语言,详解C++的内存对齐(memory alignment)

转载请保留以下声明 作者:赵宗晟 出处:https://www.cnblogs.com/zhao-zongsheng/p/9099603.html 很多写C/C++的人都知道"内存对齐"的概念以及规则,但不一定对他有很深入的了解.这篇文章试着从硬件到C++语言.更彻底地讲一下C++的内存对齐. 什么是内存对齐(memory alignment) 首先,什么是内存对齐(memory alignment)?这个是从硬件层面出现的概念.大家都知道,可执行程序是由一系列CPU指令构成的.CPU

编写跨平台代码之memory alignment

编写网络包(存储在堆上)转换程序时,在hp-ux机器上运行时会遇到 si_code: 1 - BUS_ADRALN - Invalid address alignment. Please refer to the following link that helps in handling unaligned data 错误,经排查,是由于hp-ux 的cpu基于IA-64架构, 不支持内存随机存取,需要做字节序对齐操作. 当将内存数据类型进行强制转换后,随机读取的field1 地址很有可能不在一

GNU C - 关于8086的内存访问机制以及内存对齐(memory alignment)

一.为什么需要内存对齐? 无论做什么事情,我都习惯性的问自己:为什么我要去做这件事情? 是啊,这可能也是个大家都会去想的问题, 因为我们都不能稀里糊涂的或者.那为什么需要内存对齐呢?这要从cpu的内存访问机制说起. 为了了解清楚cpu的内存访问机制,昨天整晚都在查找资料,但是还是找不到很好的介绍资料.后来只是找到了相关 的一些介绍的博客. 这些博客中大多都是以介绍内存对齐为主要目的,然后顺带着说一下cpu的内存访问机制,所以 找不到权威的资料,后来听说<<汇编语言编程艺术>>这本书

#define barrier() __asm__ __volatile__(&quot;&quot;: : :&quot;memory&quot;) 中的memory是gcc的东西

gcc内嵌汇编简介 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作. 1.简单的内嵌汇编 例: __asm__ __volatile__("hlt"); "__asm__"表示后面的代码为内嵌汇编,"asm"是"__asm__"的别名.&

GCC在C语言中内嵌汇编 asm __volatile__ 【转】

转自:http://blog.csdn.net/pbymw8iwm/article/details/8227839 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作. 1.简单的内嵌汇编 例: __asm__ __volatile__("hlt"); "__asm__"表示后面的

GCC内嵌AT&amp;T汇编语法

一 基本语法 1 寄存器引用 引用寄存器要在寄存器号前加百分号%,如"movl %eax, %ebx". 80386有如下寄存器: 1.8个32-bit寄存器 %eax,%ebx,%ecx,%edx,%edi,%esi,%ebp,%esp: 2.8个16-bit寄存器,它们事实上是上面8个32-bit寄存器的低16位:%ax,%bx,%cx,%dx,%di,%si,%bp,%sp: 3.8个8-bit寄存器:%ah,%al,%bh,%bl,%ch,%cl,%dh,%dl.它们事实上是寄

GCC在C语言中内嵌汇编 asm __volatile__

转自 http://blog.csdn.net/pbymw8iwm/article/details/8227839 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作. 1.简单的内嵌汇编例: __asm__ __volatile__("hlt"); "__asm__"表示后面的代