C语言结构体内存对齐(#prama / __attribute__)

本文测试机器为X86_64架构,系统为ubuntu-16.04 LTS,gcc version 7.4.0

一、默认的内存对齐

首先,通过一个例子来介绍什么是内存对齐。

#include <stdio.h>
int main( )
{
    struct data
    {
        float a; 
        char b;
        int c;
    }; 
    struct data e ;
    printf ( "%d\n", sizeof ( e ) ) ;
    printf ( "%u %u %u\n", &e.a, &e.b, &e.c) ;
	
    return 0 ;
}

输出为:
12
3495431596 3495431600 3495431604

主观上我们认为结构体大小是9字节,此处由于内存对齐,gcc会填充若干字节,填充规则如下:
1、结构体的起始地址按最大成员的大小进行对齐
2、每个成员按其大小进行对齐
3、结构体的大小必须是最大成员的整数倍

该实例中存在三个成员,最大成员占四个字节,所以结构体起始地址(成员a的地址)为4的倍数3495431596;由于成员a占四个字节,且成员b按1对齐,所以b的起始地址为3495431600;由于成员b只占一个字节,且成员c按4对齐,所以在b之后填充三个字节,然后再存储c。

事实上内存地址的对齐还受到 #pragma pack 的影响,下面会介绍#pragma pack的使用

二、为什么需要内存对齐

至于为什么

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值