C/C++中的结构体对齐问题(内存对齐)
由于程序运行时占用的内存过大,所以想办法给程序瘦身。
在调试中发现结构体占用的size竟然和预想的不一样,原来……
看看下面讲的吧,肯定会不枉此看哦!
1,比如:
struct{
short a1;
short a2;
short a3;
}A;
struct{
long a1;
short a2;
}B;
sizeof(A)=6, sizeof(B)=8,为什么?
注:sizeof(short)=2,sizeof(long)=4
因为:“成员对齐有一个重要的条件,即每个成员按自己的方式对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里默认是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节.”(引用)
结构体A中有3个short类型变量,各自以2字节对齐,结构体对齐参数按默认的8字节对齐,则a1,a2,a3都取2字节对齐,则sizeof(A)为6,其也是2的整数倍;
B中a1为4字节对齐,a2为2字节对齐,结构体默认对齐参数为8,则a1取4字节对齐,a2取2字节对齐,结构体大小6字节,6不为4的整数倍,补空字节,增到8时,符合所有条件,则sizeof(B)为8;
可以设置成对齐的
#pragma pack(1)
#pragma pack(push)
#pragma pack(1)
struct{
short a1;
short a2;
short a3;
}A;
struct{
long a1;
short a2;
}B;
#pragma pack(pop)
结果为sizeof( A)=6,sizeof( B)=6
************************
2,又如:
#pragma pack(8)
struct S1{
char a;
long b;
};
struct S2 {
char c;
struct S1 d;
long long e;
};
#pragma pack()
sizeof(S2)结果为24.
成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐.
也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节.
S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以
相关文档:
函数名与函数指针
一 通常的函数调用
一个通常的函数调用的例子:
//自行包含头文件
void MyFun(int x); //此处的申明也可写成:void MyFun( int );
int main(int argc, char* argv[])
{
MyFun(10); //这里是调用My ......
今天项目组发生一个事情就是,后台aix上对多语言文本(英语+汉字)换行问题搞不太清楚。
最早前台的多字符的代码我检查了一下(按照0-128以外算中文的代码)发现不是安全的代码。
(delphi 7.0)
delphi安全的混合字符的操作方法是:
在strsUtils单元中
leftstr
MidStr
Rightstr
aix下是: ......
来自:http://blogger.org.cn/blog/more.asp?name=binaryluo&id=11408
C文件操作遇到的状况
1.将一个文件读到另一个文件,用“(ch = getc(fp)) != EOF”来判断文件是否结束,如果文件是全英文文本的话绝对没问题,新文件的大小和原文件大小一样;但是如果是一些有中文字符或者是二进制 ......
C、传统 C++
#include <assert.h>
//设定插入点
#include <ctype.h>
//字符处理
#include <errno.h>
//定义错误码
#include <float.h>
//浮点数处理
#include <fstream.h>
//文件输入/输出
#include <iomanip.h> ......
#
是生成字符串:
#define a(x) #x
a(bc
) => "bc"
##
是连接:
#define a(x) abc##x
&n ......