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



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

/**************one.c *********************/
;ONSaEw#include <stdio.h>
)rh*@f(Ljtypedef struct data+pD6p6^ZH'x
{
(qa/Xv J(W.vLinux伊甸园论坛        char a;
M&u,f1K8e l&LlJBWd        short b;
7e.fU6qA[_:G        double c;       /* 为什么加上此句,windows下与linux执行结果就不一致了 */
@_9[+TeL/f4b        char d;Linux伊甸园论坛(r#}4?h,h:[2}#e
}my_data;ZI*}6o2F~*K)J
0C0dh
d.e2R`j d

int main(void)"a Pr/]Rf
{`:f)B        hy\
        printf("sizeof(short)=%d\n",sizeof(short));
0X V\}$G$X2gDm        printf("sizeof(double)=%d\n",sizeof(double));
O2@@.?V-f        printf("sizeof(my_data)=%d\n",sizeof(my_data));
+e(@IO
Fn nM
        return 0;
x$Pc:t.Z:y@}

顶部
dearvoid
版主
Rank: 7Rank: 7Rank: 7
Clark J. Wang



UID 26605
精华 26
积分 61(积分有什么用?)
帖子 4814
阅读权限 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
积分 61(积分有什么用?)
帖子 4814
阅读权限 100
注册 2002-10-12
来自 Beijing, China
状态 离线
发表于 2007-10-8 09:31  资料  个人空间  短消息  加为好友 
FYI:?X{(D:u!q1f

QUOTE:
-(dearvoid@LinuxEden:Forum)-(~/tmp)-#N6r1W!?1z R
_

[$$=4349 $?=0]
; cat foo.c
`}azB_lq
#include <stdio.h>-i+x NP-W2W.foa

"s+n%[)G0?a\typedef struct {)GwQ0MIr
    char        a;
W
B}&r(b$h-hwww.linuxeden.com
    short       b;*J6F!vrv.jE
    double      c;
^"o*fkp K7i+]h    char        d;
'v#rq~0x&_qEC} my_data_t;www.linuxeden.com6nk&kK{/]
xDG2|

Linux伊甸园论坛9l[0Ja"o(j
intwww.linuxeden.com'M1Zv(k:l
main(int argc, char *argv[])
st3E"Q L(`zwww.linuxeden.com{Linux伊甸园论坛)y'Pu        |r
    printf("sizeof(my_data_t) = %d\n", sizeof(my_data_t));
dM'@ ax1}8T1er
3p MN/w        Cw3g2\]q0m!s9{    return 0;
G7O'k
_.jW1C:D0uWwww.linuxeden.com
}
\
h5hH
ok1B BH,d(N
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
j)I1W+ZZ*w bhLinux伊甸园论坛 [$$=4349 $?=0]
; gcc foo.cLinux伊甸园论坛#F2p)q9Y0}Ds&y-B
-(dearvoid@LinuxEden:Forum)-(~/tmp)-G&_K.x3h
[$$=4349 $?=0]
; ./a.out8BtV!wX#`!d3SLw
sizeof(my_data_t) = 16
Zmwb^Linux伊甸园论坛
-(dearvoid@LinuxEden:Forum)-(~/tmp)-        ? W3[uh]Ov
[$$=4349 $?=0]
; bye
#?D8_!jFq \i






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



UID 26605
精华 26
积分 61(积分有什么用?)
帖子 4814
阅读权限 100
注册 2002-10-12
来自 Beijing, China
状态 离线
发表于 2007-10-8 09:37  资料  个人空间  短消息  加为好友 
如果要强制 1 字节对齐:www.linuxeden.com d%{V:{)b5w}%mr

QUOTE:
-(dearvoid@LinuxEden:Forum)-(~/tmp)-www.linuxeden.com/Aqp)r`hS:U:G-i
[$$=4349 $?=0]
; cat foo.cLinux伊甸园论坛){W
r3~:iOY

#include <stdio.h>j/r6A!vq h0L2]P
ak'h(u8];P2McL@"? N
#pragma pack(1)

\ E0~+N$Su2\a+a*vLinux伊甸园论坛
typedef struct {eq9\@&h$Z9s
    char        a;
[1xq3bJ ZT    short       b;+r$A6sV1M1`
q

    double      c;e
Ae.B[,t\

    char        d;-k(zc:]K`Q
} my_data_t;
_Gi9Ln)r5iwww.linuxeden.com#pragma pack()
W#K.y2t8iLinux伊甸园论坛%Y`-A0eG m&\H)G k
intS"D8Vug
main(int argc, char *argv[])
!QFL'T"y{r
|8c%aHd)\y{2G

    printf("sizeof(my_data_t) = %d\n", sizeof(my_data_t));Linux伊甸园论坛Z$]q;fA)b

sCCVkv%v#a    return 0;
Wu
P]Y uZ+S
}*_Q1O7B2Y&vmXH
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
7}4}$U.T7H
K
[$$=4349 $?=0]
; gcc foo.cLinux伊甸园论坛!D;y/eEq+S+g
-(dearvoid@LinuxEden:Forum)-(~/tmp)-Linux伊甸园论坛MrU2sy:O
[$$=4349 $?=0]
; ./a.outk
uA6vp-E:zO

sizeof(my_data_t) = 12
7a)s Eh#YB{1g
-(dearvoid@LinuxEden:Forum)-(~/tmp)-)zG6ZR@9T
[$$=4349 $?=0]
; bye
7r4P+u sH$\]T






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



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

QUOTE:
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
VM)f8v"c,_(o [$$=23492 $?=0]
; cat foo.c
,D'It        `fWLinux伊甸园论坛
#include <stdio.h>
xx7h$\gw5J@V-Fqwww.linuxeden.com
|~pZ/J-].`typedef struct __attribute__((__packed__)) {
#hi |6I5xz    char        a;
yF-E$i*sFB+bC{www.linuxeden.com    short       b;P
z%~
jx l

    double      c;
]c Q8B r        G
D1qjLinux伊甸园论坛
    char        d;
W#RP~ I        |}*Ruy2E} my_data_t;
&~p l"^/ze8\xta*?
%G[w6K;qpUint
g0jEsz9O6rdwww.linuxeden.commain(int argc, char *argv[])q        L)M8@p;{\
{
w3B y!e%M%w_ qE    printf("sizeof(my_data_t) = %d\n", sizeof(my_data_t));www.linuxeden.comZ!rj.phBP_

u$v
w[0t1i8nH"f S
s

    return 0;1AsR3T:pQA0I7wJ
}
)]$|!]        ~0EG/|9Z8p5h
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
rp`GX.Z [$$=23492 $?=0]
; gcc foo.c
$P
ts5Sku7Y~?www.linuxeden.com
-(dearvoid@LinuxEden:Forum)-(~/tmp)-
:xr+Dy`o)Sq [$$=23492 $?=0]
; ./a.out
$a
D A)\ }`-`
sizeof(my_data_t) = 12Linux伊甸园论坛5@3Vr(O{r6a3IY
-(dearvoid@LinuxEden:Forum)-(~/tmp)-www.linuxeden.com#Wv&acK4RR.U
[$$=23492 $?=0]
; byejz5Z0h _W;AY






'
◆ 发帖时请【突出主题】, 以便您的问题能够及时得到回复
◆ 发帖时请将您的【代码】或者【脚本】写在 [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来改变这一系数
$_'S3Gi6QpHm{U
G!{
Do5s2JP#uqLinux伊甸园论坛
按理说n=8时,结果应该为24才对(windows下是24),这是为什么??? Linux伊甸园论坛]|(X
Q9_oK

Linux伊甸园论坛6f"k2YlUbLC
3N:J&eF2L0N
"p+c2r
I?b

8w[{\.koe.O
.

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



UID 26605
精华 26
积分 61(积分有什么用?)
帖子 4814
阅读权限 100
注册 2002-10-12
来自 Beijing, China
状态 离线
发表于 2007-10-8 13:07  资料  个人空间  短消息  加为好友 
不同的 compiler 可能有不同的解释吧:
C3vz&rX

QUOTE:
Linux伊甸园论坛0ND@gBd
... ...
zs
kMoz
Ucfwww.linuxeden.com
Members of structures are aligned on the specified byte-alignment, or on their natural alignment boundary, whichever is less.www.linuxeden.com'kC-v+\y(in!sXh
... ...
'eOzFJ1FC^Linux伊甸园论坛






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



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


]+J'u2\SUfiLinux伊甸园论坛[ 本帖最后由 dearvoid 于 2007-10-8 13:24 编辑 ]





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



UID 209969
精华 0
积分 10(积分有什么用?)
帖子 5
阅读权限 10
注册 2007-9-5
状态 离线
发表于 2007-10-12 15:55  资料  个人空间  短消息  加为好友 
不兼容
[Xs
_![bd'z$H'b?:j

E4t,U:nW ?!r
hLinux伊甸园论坛
-h
j0?W^W mZ3J


[g+R'G$h.sA?bwww.linuxeden.comooS;w,t9B        @1C

1Mc        u;A|(po,cwww.linuxeden.com--------------------------------------------------------------------------zko+z l(BYM
水里的游鱼是沉默的,陆地上的兽类是喧闹的,空中的飞鸟是歌唱着的。但是,人类却兼有三正消癌平片海里的沉默,地上的喧闹与空中的音乐

顶部
不容错过的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。|5|zg0C1O,t.g*OV
但是在Linux下用gcc  得到的是16,这应该是和编译器有关

顶部
 



当前时区 GMT+8, 现在时间是 2008-5-16 15:54

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

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