标题: 一个C语言内存对齐的问题
hqs988
新生入学
Rank: 1
注册用户



UID 114730
精华 0
积分 0(积分有什么用?)
帖子 4
阅读权限 10
注册 2005-3-29
状态 离线
发表于 2007-10-8 09:16  资料  个人空间  短消息  加为好友 
一个C语言内存对齐的问题

/**************one.c *********************/Linux伊甸园论坛X.cb"q"`
#include <stdio.h>
j%m)h{5it9N,b9ktypedef struct datawww.linuxeden.com&Oj(T#~rl
{
$EU ~9^dgX        char a;
$K{8j(fxd\        short b;
}]n[:J:\ ^Linux伊甸园论坛        double c;       /* 为什么加上此句,windows下与linux执行结果就不一致了 */[-RIpa
        char d;www.linuxeden.comcmfE;HIJ2MN1Cq
}my_data;
pZ
q%c:@p&cL~www.linuxeden.com
R:Qc ?db
int main(void)
-a#Q9Z B-Ln`Linux伊甸园论坛{
*}[4t"jRZ]+q        printf("sizeof(short)=%d\n",sizeof(short));8IQM+C t
S{*w

        printf("sizeof(double)=%d\n",sizeof(double));www.linuxeden.com*m2[ y
`C)s2Tu,?

        printf("sizeof(my_data)=%d\n",sizeof(my_data));
!S4Lg[zs \
cRLinux伊甸园论坛
        return 0;
n
L7a t$S.E&]:\
}

顶部
不容错过的IBM 集群技术资源汇总
dearvoid
版主
Rank: 7Rank: 7Rank: 7
Clark J. Wang



UID 26605
精华 26
积分 63(积分有什么用?)
帖子 4816
阅读权限 100
注册 2002-10-12
来自 Beijing, China
状态 离线
发表于 2007-10-8 09:26  资料  个人空间  短消息  加为好友 
一般来讲 linux 上是按 4 字节对齐的, 不晓得 windows 上会如何





'
◆ 发帖时请【突出主题】, 以便您的问题能够及时得到回复
◆ 发帖时请将您的【代码】或者【脚本】写在 [code] 和 [/code] 中间
顶部
dearvoid
版主
Rank: 7Rank: 7Rank: 7
Clark J. Wang



UID 26605
精华 26
积分 63(积分有什么用?)
帖子 4816
阅读权限 100
注册 2002-10-12
来自 Beijing, China
状态 离线
发表于 2007-10-8 09:31  资料  个人空间  短消息  加为好友 
FYI:v0iK0Q|O

QUOTE:
-(dearvoid@LinuxEden:Forum)-(~/tmp)-B K\xl*sO
[$$=4349 $?=0]
; cat foo.c
`|VY!a'l/en7HLinux伊甸园论坛
#include <stdio.h>*[p V iQ
N["]
k_X'YVS

typedef struct {F,M        l@Dj^f[
    char        a;
E;Eo1\/?#{Q    short       b; xP1E!T`0W
    double      c;
,rB'[R o    char        d;tzTp_'Q&{
} my_data_t;
;mR qVY'J~"q
"rQ'o2OR,Re[jintwww.linuxeden.com@LPpq!k2R&e~
main(int argc, char *argv[])qXw1D
^l'q

{\
VAw1u3`,JG

    printf("sizeof(my_data_t) = %d\n", sizeof(my_data_t));
m&N7OG        }N^Ti*QR1w9M*FI0b3v1O
B

    return 0;
v*kZ/CM4l        yl}
I9[$WkU
-(dearvoid@LinuxEden:Forum)-(~/tmp)-@LhAi-vg-}
[$$=4349 $?=0]
; gcc foo.cwww.linuxeden.comi6}2~"X6H
-(dearvoid@LinuxEden:Forum)-(~/tmp)-!\:nvLB,WA
[$$=4349 $?=0]
; ./a.out
|#v
SH        wb        z%Y0\www.linuxeden.com
sizeof(my_data_t) = 16?5qM4NE
-(dearvoid@LinuxEden:Forum)-(~/tmp)-a+q5UJ7Ew
[$$=4349 $?=0]
; byeLinux伊甸园论坛@$e{p(vr






'
◆ 发帖时请【突出主题】, 以便您的问题能够及时得到回复
◆ 发帖时请将您的【代码】或者【脚本】写在 [code] 和 [/code] 中间
顶部
不容错过的IBM 集群技术资源汇总
dearvoid
版主
Rank: 7Rank: 7Rank: 7
Clark J. Wang



UID 26605
精华 26
积分 63(积分有什么用?)
帖子 4816
阅读权限 100
注册 2002-10-12
来自 Beijing, China
状态 离线
发表于 2007-10-8 09:37  资料  个人空间  短消息  加为好友 
如果要强制 1 字节对齐:
oG[qT-o4Q

QUOTE:
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
!zW~:Qnwww.linuxeden.com [$$=4349 $?=0]
; cat foo.c
(a~5Ew@!Y
#include <stdio.h>
)wRbK9O        Kr$y|W fLinux伊甸园论坛`7U(Y;^J&|[
#pragma pack(1)www.linuxeden.comA4@o;p_\M!t(C.j:xz
typedef struct {
c'TV4H5ax-_%zZ    char        a;
E7J,sVT"t    short       b;R._9A'W6oBJJ T'c
    double      c;jM N5OP
    char        d;7_&D$K:i8V)Udv
} my_data_t;Linux伊甸园论坛qV^/U(Sr
#pragma pack()
)VM:Mt/mkO)C
u S6IhWoint

N p"C z.|$H!M
main(int argc, char *argv[])&V$mI9O+PAC$H
{
0Z:kW2zN.~ L6j`www.linuxeden.com    printf("sizeof(my_data_t) = %d\n", sizeof(my_data_t));.p3e-vk^.`
PK+h


(Q6fU1?        jf:o[    return 0;fX5G&Rx[$V
}
,LHYp7o@'n{www.linuxeden.com
-(dearvoid@LinuxEden:Forum)-(~/tmp)-#e!b%R&}X%e)[M
[$$=4349 $?=0]
; gcc foo.cv$Vf)L eM
w/DPw

-(dearvoid@LinuxEden:Forum)-(~/tmp)-0Mj+KU ]2?
[/t*S

[$$=4349 $?=0]
; ./a.out+G1B`$mW7_
sizeof(my_data_t) = 12+L6E5G{dc`%X
-(dearvoid@LinuxEden:Forum)-(~/tmp)-FIho+K
[$$=4349 $?=0]
; bye
;O9`+rGagK4RkC






'
◆ 发帖时请【突出主题】, 以便您的问题能够及时得到回复
◆ 发帖时请将您的【代码】或者【脚本】写在 [code] 和 [/code] 中间
顶部
不容错过的IBM 集群技术资源汇总
dearvoid
版主
Rank: 7Rank: 7Rank: 7
Clark J. Wang



UID 26605
精华 26
积分 63(积分有什么用?)
帖子 4816
阅读权限 100
注册 2002-10-12
来自 Beijing, China
状态 离线
发表于 2007-10-8 09:49  资料  个人空间  短消息  加为好友 
OR:Linux伊甸园论坛&Q^)UN~P

QUOTE:
-(dearvoid@LinuxEden:Forum)-(~/tmp)-Linux伊甸园论坛,?4O4fR
s,}_.S

[$$=23492 $?=0]
; cat foo.cwww.linuxeden.com}'pY8k`u&W
#include <stdio.h>Z W5L4Q.Q

7v n4D.T6O qtypedef struct __attribute__((__packed__)) {qEn]m3Au7Vl5j
    char        a;
@`+M"w        C\2QLinux伊甸园论坛    short       b; B-qV#z-t9^*F`#l9l
    double      c;
-^:P@RB!Q:_I(uLinux伊甸园论坛    char        d;
"K p(S$zqo/l$C+\Linux伊甸园论坛} my_data_t;
+\yS(P'VVwww.linuxeden.com%@*{U5d
raN

intI
F,B_(U#X9X;`l$j

main(int argc, char *argv[])
Z
v b7b+c
{*g.hr9y
{1O'p$VM!D
    printf("sizeof(my_data_t) = %d\n", sizeof(my_data_t));4_(JDG/lI

eEi z7Nu]    return 0;^fa Ph)B)s6[ t
}
@'weo7[4EZ3?/RD?/B
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
5|\*N$r3@\KB [$$=23492 $?=0]
; gcc foo.c
RkJg%R
awww.linuxeden.com
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
a`2o`4g [$$=23492 $?=0]
; ./a.outLinux伊甸园论坛 \v3d,|Uw,K(i~
sizeof(my_data_t) = 12Q'j
Z3AWT.Jx        z$|d

-(dearvoid@LinuxEden:Forum)-(~/tmp)-Linux伊甸园论坛u[!l1gT|c        z~+B7s
[$$=23492 $?=0]
; bye
Y dC,^ z~
i






'
◆ 发帖时请【突出主题】, 以便您的问题能够及时得到回复
◆ 发帖时请将您的【代码】或者【脚本】写在 [code] 和 [/code] 中间
顶部
hqs988
新生入学
Rank: 1
注册用户



UID 114730
精华 0
积分 0(积分有什么用?)
帖子 4
阅读权限 10
注册 2005-3-29
状态 离线
发表于 2007-10-8 12:43  资料  个人空间  短消息  加为好友 
有一点不明白

预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数
N_ X%E$T?X+k`{#l/|
h)GM9i_

按理说n=8时,结果应该为24才对(windows下是24),这是为什么??? YX]OZ$a-J
-in9]#[+l

:iE6wP2XG5F-iwww.linuxeden.com mh
zQayj

T%[6K3~F9[:p5~8}
.

顶部
不容错过的IBM 集群技术资源汇总
dearvoid
版主
Rank: 7Rank: 7Rank: 7
Clark J. Wang



UID 26605
精华 26
积分 63(积分有什么用?)
帖子 4816
阅读权限 100
注册 2002-10-12
来自 Beijing, China
状态 离线
发表于 2007-10-8 13:07  资料  个人空间  短消息  加为好友 
不同的 compiler 可能有不同的解释吧:Linux伊甸园论坛0~6N1q0aMyC

QUOTE:
;qB)n {(b,zry7@... ...^$t'WF5t3n T@2h#D
Members of structures are aligned on the specified byte-alignment, or on their natural alignment boundary, whichever is less.{ d3}f'EoVN
... ...|,Hz,`(o*g0\&_#E0\






'
◆ 发帖时请【突出主题】, 以便您的问题能够及时得到回复
◆ 发帖时请将您的【代码】或者【脚本】写在 [code] 和 [/code] 中间
顶部
不容错过的IBM 集群技术资源汇总
dearvoid
版主
Rank: 7Rank: 7Rank: 7
Clark J. Wang



UID 26605
精华 26
积分 63(积分有什么用?)
帖子 4816
阅读权限 100
注册 2002-10-12
来自 Beijing, China
状态 离线
发表于 2007-10-8 13:22  资料  个人空间  短消息  加为好友 
刚参考了一下 C99 标准中的 6.10.6 章节, 除了 #pragma STDC 之外的其他 #pragma 都是跟实现相关的 (implementation-defined), 不同的编译器之间可能不兼容+C#N
_ Mqe

www.linuxeden.comh8O8yp4[b
[ 本帖最后由 dearvoid 于 2007-10-8 13:24 编辑 ]





'
◆ 发帖时请【突出主题】, 以便您的问题能够及时得到回复
◆ 发帖时请将您的【代码】或者【脚本】写在 [code] 和 [/code] 中间
顶部
mycatboys
新生入学
Rank: 1



UID 209969
精华 0
积分 10(积分有什么用?)
帖子 5
阅读权限 10
注册 2007-9-5
状态 离线
发表于 2007-10-12 15:55  资料  个人空间  短消息  加为好友 
不兼容www.linuxeden.com!a5s8Ii
K@4D.e)bn

;s
f.q3w7O-Wf-D
AJ6V

        zkc0s8@){6?
www.linuxeden.com        ZB+PF3Y6w;l
0t"{
j        ~(?2rAh8["s

.h}^{|Gq-e e
--------------------------------------------------------------------------
kO
VtA(xgLinux伊甸园论坛
水里的游鱼是沉默的,陆地上的兽类是喧闹的,空中的飞鸟是歌唱着的。但是,人类却兼有三正消癌平片海里的沉默,地上的喧闹与空中的音乐

顶部
不容错过的IBM 集群技术资源汇总
xgf
新生入学
Rank: 1



UID 214769
精华 0
积分 11(积分有什么用?)
帖子 34
阅读权限 10
注册 2007-10-17
状态 离线
发表于 2007-10-27 15:06  资料  个人空间  短消息  加为好友 
我在Windows下用VC6和DEV C++4。9。9。2得到的是24。
e#n"v dAwww.linuxeden.com但是在Linux下用gcc  得到的是16,这应该是和编译器有关

顶部
 



当前时区 GMT+8, 现在时间是 2008-5-17 13:36

    Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
Processed in 0.300477 second(s), 5 queries

清除 Cookies - 联系我们 - Linux伊甸园 - Archiver - WAP