易截截图软件、单文件、免安装、纯绿色、仅160KB

c 内存对齐

当在C 中定义了一个结构类型时,它的大小是否等于各字段(field) 大小之和?编译器将如何在内存中放置这些字段?ANSI C对结构体的内存布局有什么要求?而我们的程序又能否依赖这种布局?这些问题或许对不少朋友来说还有点模糊,那么本文就试着探究它们背后的秘密。
首先,至少有一点可以肯定,那就是ANSI C 保证结构体中各字段在内存中出现的位置是随它们的声明顺序依次递增的,并且第一个字段的首地址等于整个结构体实例的首地址。比如有这样一个结构体:
struct vector
{int x,y,z;} s;
int *p,*q,*r;
struct vector *ps;
p = &s.x;
q = &s.y;
r = &s.z;
ps = &s;
assert(p < q);
assert(p < r);
assert(q < r);
assert((int*)ps == p);
// 上述断言一定不会失败
这时,有朋友可能会问:" 标准是否规定相邻字段在内存中也相邻?" 。 唔,对不起,ANSI C 没有做出保证,你的程序在任何时候都不应该依赖这个假设。那这是否意味着我们永远无法勾勒出一幅更清晰更精确的结构体内存布局图?哦,当然不是。不过先让我们从这个问题中暂时抽身,关注一下另一个重要问题————内存对齐。
许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k( 通常它为4 或8) 的倍数,这就是所谓的内存对齐,而这个k 则被称为该数据类型的对齐模数(alignment modulus) 。当一种类型S 的对齐模数与另一种类型T 的对齐模数的比值是大于1 的整数,我们就称类型S 的对齐要求比T 强( 严格) ,而称T 比S 弱( 宽松) 。这种强制的要求一来简化了处理器与内存之间传输系统的设计,二来可以提升读取数据的速度。比如这么一种处理器,它每次读写内存的时候都从某个8 倍数的地址开始,一次读出或写入8 个字节的数据,假如软件能保证double 类型的数据都从8 倍数地址开始,那么读或写一个double 类型数据就只需要一次内存操作。否则,我们就可能需要两次内存操作才能完成这个动作,因为数据或许恰好横跨在两个符合对齐要求的8 字节内存块上。某些处理器在数据不满足对齐要求的情况下可能会出错,但是Intel 的IA32 架构的处理器则不管数据是否对齐都能正确工作。不过Intel 奉劝大家,如果想提升性能,那么所有的程序数据都应该尽可能地对齐。Win32 平台下的微软C 编译器(cl.exe for 80x86) 在默认情况下采用如下的对齐规则: 任何基本数据类型T 的对齐模数就是T 的大小,即s


相关文档:

Delphi 与 C/C++ 数据类型对照表

Delphi 与 C/C++ 数据类型对照表
Delphi数据类型C/C++
ShorInt
8位有符号整数
char
Byte
8位无符号整数
BYTE,unsigned short
SmallInt
16位有符号整数
short
Word
16位无符号整数
unsigned short
Integer,LongInt
32位有符号整数
int,long
Cardinal,LongWord/DWORD
32位无符号整数
unsigned long
Int6 ......

c编译全过程

C语言编译全过程
    编译的概念:编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。
    编译的完整过程:C源程序-->预编译处理(.c)-- ......

C问题集锦(一)

楼主发表于:2009-07-24 10:11:03是这样的,去一家公司面试,遇到了一道c语言的题,个人
感觉很怪,以前没见过类似的,然后主考官说这是关于C语言强弱类型转换什么的,我感觉他
自己都不完全清楚,然后回来在网上查到这是英国剑桥大学网上出的计算机题 :
#include <stdio.h>
#define init_employee(X,Y) {(X),(Y),wage ......

C语言函数的出口:return语句(高质量c/c++编程指南)


C语言函数的出口:return语句(高质量c/c++编程指南) 收藏
今天看到了一篇关于c/c++语言中,对于函数出口处:return语句的正确性和效率性的检查问题。平时我们都不太看重return语句的,认为它简单,不是很重要,其实不然,return语句要是写的不好,很容易导致效率低下,甚至会出错!特别是在处理指针时。
下面看看要 ......

C文件操作与fstream读取文本文件的效率比较

这几天由于要读取较大的文本文件,所以就比较了一下两者之间的效率问题。 所要读取的文本文件结构为每行由5个数组成,int int int float int,测试的文件有33W行,大小为9M。现在要将其读到一个cube结构体里面去,结构体有5个成员变量与之对应。 两种操作的代码如下 start = clock();
    ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号