我在编程中自定义了一个结构,其中包含了不同类型的数据成员。我在使用时通过对结构变量的指针对其赋值,但其运行结果总是和所想的不同。我将代码移到TC中运行,却一切正常。后来用sizeof来检查结构的长度,却发现有所不同。在TC中结构总长等于所有成员变量的长度之和,但在VC中其结构的长度却大于各个成员的长度总和。比如一个简单的结构:
struct st{
char data0; //在TC和VC中都有sizeof(char)==1
short int data1; //在TC和VC中都有sizeof(short int)==2
long int data2; //在TC和VC中都有sizeof(long int)==4
}
在TC中该结构的长度为1+2+4=7,而在VC中其长度却为12。为什么,谁能给我个解释
struct st{
char data0; //在TC和VC中都有sizeof(char)==1
short int data1; //在TC和VC中都有sizeof(short int)==2
long int data2; //在TC和VC中都有sizeof(long int)==4
}
在TC中该结构的长度为1+2+4=7,而在VC中其长度却为12。为什么,谁能给我个解释
解决方案 »
- 用在苹果机上的xp能否用在普通pc上。
- 屏幕更新问题!急!
- 为什么我动态创建的CComBoxEx控件不能拦截响应鼠标单击的消息?
- CFormView的焦点的问题!
- 问一个关于VC6.0的安装问题(回帖给高分!!!!)
- 各位大侠,怎样实现路径选择对话框:就象VC++中的那个choose Directory对话框一样。太难了。
- 有谁知道XML啊?怎么用
- 关于菜单显示的奇怪现象
- MFC中使用glBindTexture(GL_TEXTURE_2D, texture[0])命令
- 谁知道哪里有一个增强的listctrl?详情进来
- 那里有关于vc通用控件的详尽使用资料下载?
- 我想用VC++做界面,调用JAVA程序
C/C++选项 code generation 修改为 1 Byte
讲一个最简单的例子,如果你有一个6字节长度的结构,默认情况下,编译器会把它转换为8字节的结构,这样处理起来横适合于32位的系统;而如果你改变了这个选项,编译器就可能会按照6字节进行处理。差别不是很大,但效率有点差异。这样可以改动
#pragma pack( push )
#pragma pack( 2 )
typedef struct
{
WORD idReserved; // Reserved (must be 0)
WORD idType; // Resource type (1 for icons)
WORD idCount; // How many images?
GRPICONDIRENTRY idEntries[1]; // The entries for each image
} GRPICONDIR, *LPGRPICONDIR;
#pragma pack( pop )
project菜单->settings->c/c++标签->category组合框中选择:code generation.这时你会看到"struct member alignment"字样,你可以从它下面的组合框中选为1byte,这样就等于没有字节对齐的影响了。
奇怪!不管我将"struct member alignment"改成1,2,4,8,16,我得出来的sizeof(st)都是8!!!
//#include "stdafx.h"
#include "stdio.h"struct st
{
char data0; //在TC和VC中都有sizeof(char)==1
short int data1; //在TC和VC中都有sizeof(short int)==2
long int data2; //在TC和VC中都有sizeof(long int)==4
};
#pragma pack( push )
#pragma pack( 1 )
struct st1
{
char data0; //在TC和VC中都有sizeof(char)==1
short int data1; //在TC和VC中都有sizeof(short int)==2
long int data2; //在TC和VC中都有sizeof(long int)==4
};
#pragma pack( pop )int main()
{
printf( "%d\n", sizeof( struct st ) );
printf( "%d\n", sizeof( struct st1 ) );
return 0;
}结果8
7
Press any key to continue第一个等于8,具体不清楚,大概是因为1+2<4,所以被组合成4个了
#include "stdafx.h"
#include "stdio.h"#pragma pack( 1 )
struct st
{
char data0; //在TC和VC中都有sizeof(char)==1
char data1; //在TC和VC中都有sizeof(short int)==2
long int data2; //在TC和VC中都有sizeof(long int)==4
};
#pragma pack( pop )int main()
{
printf( "%d\n", sizeof( struct st ) );
return 0;
}这样结果就是6,因为对内存访问还有偶数速度快等说法。