博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
struct内存对齐:gcc与VC的差别
阅读量:7122 次
发布时间:2019-06-28

本文共 811 字,大约阅读时间需要 2 分钟。

内存对齐是编译器为了便于CPU快速访问而采用的一项技术,对于不同的编译器有不同的处理方法。

Win32平台下的微软VC编译器在默认情况下采用如下的对齐规则: 任何基本数据类型T的对齐模数就是T的大小,即sizeof(T)。比如对于double类型(8字节),就要求该类型数据的地址总是8的倍数,而char类型数据(1字节)则可以从任何一个地址开始。Linux下的GCC奉行的是另外一套规则:任何2字节大小(包括单字节吗?)的数据类型(比如short)的对齐模数是2,而其它所有超过2字节的数据类型(比如long,double)都以4为对齐模数。

下面的程序可以验证:

#include <stdio.h>
#define OFFSET(TYPE,MEMBER)  ((int)(&(((TYPE*)0)->MEMBER)))
typedef 
struct
{
    
int a;
    
float b;
    
char c;
    
double d;
    
int *pa;
    
char *pc;
}Sta;
int main()
{
    printf(
"
a_=%d\n
",OFFSET(Sta,a));
    printf(
"
b_=%d\n
",OFFSET(Sta,b));
    printf(
"
c_=%d\n
",OFFSET(Sta,c));
    printf(
"
d_=%d\n
",OFFSET(Sta,d));
    printf(
"
pa_=%d\n
",OFFSET(Sta,pa));
    printf(
"
pc_=%d\n
",OFFSET(Sta,pc));
    
return 
0;
}

在VC上的结果是:

而在linux下的结果却是:

主要是对于double类型,VC采用的是8对齐,而gcc采用的是4对齐

转载于:https://www.cnblogs.com/xkfz007/archive/2011/12/21/2296523.html

你可能感兴趣的文章
未来大数据将改变实体营销的5个关键点
查看>>
航空公司大数据建设的思考
查看>>
优秀程序员眼中的整洁代码
查看>>
为什么说人工智能是业界下一个增长点?
查看>>
大数据开放面对的瓶颈究竟是什么?
查看>>
威联通科技QNAP QTS4.0北京发布会落幕
查看>>
从“憋大招”到快速迭代 细数Windows 10变化背后的小秘密
查看>>
小城大梦 鄂尔多斯康巴什“互联网+智慧城市”项目启动
查看>>
5月举办的大数据产业博览会筹备发布会透露哪些信息?
查看>>
数据中心供电方式详解
查看>>
大咖 | 从Ian Goodfellow到Yann LeCun,对话Quora AI大佬TOP 10
查看>>
警示:锁定中小企业的勒索软件正在改变战术
查看>>
观点 | 99%区块链公司会死掉,1%的幸存者都是区块链+
查看>>
监测网络攻击,麻省理工用上了人工智能
查看>>
不看不知道,容器化OpenStack的10个好处
查看>>
移动通信核心网需引入NFV
查看>>
《云计算揭秘企业实施云计算的核心问题》——3.3节云不适合什么场景
查看>>
Spark学习之RDD简单算子
查看>>
ARM第二季度营收增长17%至3.5亿美元
查看>>
Incorporating Copying Mechanism in Sequence-to-Sequence Learning
查看>>