深入理解C语言
2011-11-22 11:23
211 查看
#include <stdio.h> void foo(void) { int a; printf("%d\n", a); } void bar(void) { int a = 42; } int main(void) { bar(); foo(); }
你知道这段代码会输出什么吗?A) 一个随机值,B) 42。
A 和 B都对.
如果你使用一般的编译,会输出42,因为我们的编译器优化了函数的调用栈(重用了之前的栈),为的是更快,这没有什么副作用。反正你不初始化,他就是随机值,既然是随机值,什么都无所谓。
但是,如果你的编译打开了代码优化的开关,-O,这意味着,foo()函数的代码会被优化成main()里的一个inline函数,也就是说没有函数调用,就像宏定义一样。于是你会看到一个随机的垃圾数。
struct X { int a; char b; int c; }; printf("%d,", sizeof(struct X)); struct Y { int a; char b; int c; char d}; printf("%d\n", sizeof(struct Y)); struct Z { int a; char b; char d; int c}; printf("%d\n", sizeof(struct Z));
这个代码会输出什么?
12
16
12
你一定知道字节对齐,是向4的倍数对齐。
但是,你知道为什么要字节对齐吗?还是因为性能。因为这些东西都在内存里,如果不对齐的话,我们的编译器就要向内存一个字节一个字节的取,这样一来,struct X,就需要取9次,太浪费性能了,而如果我一次取4个字节,那么我三次就搞定了。所以,这是为了性能的原因。
但是,为什么struct Y不向12 对齐,却要向16对齐,因为char d; 被加在了最后,当编译器计算一个结构体的尺寸时,是边计算,边对齐的。也就是说,编译器先看到了int,很好,4字节,然后是 char,一个字节,而后面的int又不能填上还剩的3个字节,不爽,把char b对齐成4,于是计算到d时,就是13 个字节,于是就是16啦。但是如果换一下d和c的声明位置,就是12了。
相关文章推荐
- [转]深入理解C语言指针的奥秘
- 深入理解C语言
- 深入理解C语言中的移位运算
- 深入理解c语言指针-第六章
- 深入理解C语言中的const
- 深入理解C语言指针的奥秘
- c语言深入理解<3>
- 深入理解C语言指针的奥秘
- 深入理解C语言及未定义那些事儿
- C语言的强符号和弱符号深入理解
- C语言头文件深入理解
- 【笔试面试知识点查缺补漏深入理解之C与C++篇】C语言中的malloc和free
- 深入理解C语言中的指针与数组之指针篇
- 深入理解C语言指针
- C语言01深入理解基本概念(一)
- 转:深入理解C语言指针的奥秘
- 基于C语言sprintf函数的深入理解
- 深入理解C语言-04 预处理
- 深入理解C语言指针的奥秘(上)
- 深入理解C语言的数据分类和存储