在VC中定义
class A{
WORD a1;
DWORD a2;
};
n=sizeof(A);
问:为什么n等于8?
注:WORD在VC中是16位的,DWORD在VC中是32位的,
可是实际运行这个程序确实是8?
class A{
WORD a1;
DWORD a2;
};
n=sizeof(A);
问:为什么n等于8?
注:WORD在VC中是16位的,DWORD在VC中是32位的,
可是实际运行这个程序确实是8?
解决方案 »
- VC 中除了 DoModal()可以显示对话框,还有什么方式可以显示对话框?
- Double转CString问题
- 关于映射模式的问题!
- 大家帮帮忙很急的程序编译通过但链接时出现以下问题
- 急聘vc软件开发工程师
- 如何捕捉用CFile打开不存在的文件时的错误?
- 对话框中判断edit框输入是否为空??????急!!!!!
- (急)线程监视串口问题!
- 哪位大哥有柱状图的例子呀?我是挺希望那些柱能变的漂亮一些,怎么做?
- MFC 新插入的dialog添加的类的静态文本的字体大小如何改变
- 把CStringArray m_strTemplateCodes;设成全局变量在别的地方已经用EXTERN声明但还有错
- 这个编译错误怎么解决
class B{
WORD a1;
WORD a2;
};
n=sizeof(B);
n就等于4?
而 class C{
DWORD a1;
DWORD a2;
}
n=sizeof(C);
n就等于8?
#pragma pack(push,1)
class A{
WORD a1;
DWORD a2;
};
#pragma pack(pop)
WORD a1;
DWORD a2;
};#pragma pack()的話,N的值將為6。
class B{
WORD a1;
WORD a2;
};
2+2为4
class C{
DWORD a1;
DWORD a2;
}
4+4=8class A{
WORD a1;//DWORD 前的内存不为4 调整为4
DWORD a2;//4
};
所以4+4=8看看<<深度探索 c++ 对象模型>>上讲的很详细
#pragma pack( [ n] )Specifies packing alignment for structure and union members. Whereas the packing alignment of structures and unions is set for an entire translation unit by the /Zp option, the packing alignment is set at the data-declaration level by the pack pragma. The pragma takes effect at the first structure or union declaration after the pragma is seen; the pragma has no effect on definitions.When you use #pragma pack(n), where n is 1, 2, 4, 8, or 16, each structure member after the first is stored on the smaller member type or n-byte boundaries. If you use #pragma pack without an argument, structure members are packed to the value specified by /Zp. The default /Zp packing size is /Zp8.The compiler also supports the following enhanced syntax:#pragma pack( [ [ { push | pop}, ] [ identifier, ] ] [ n ] )This syntax allows you to combine program components into a single translation unit if the different components use pack pragmas to specify different packing alignments. Each occurrence of a pack pragma with a push argument stores the current packing alignment on an internal compiler stack. The pragma’s argument list is read from left to right. If you use push, the current packing value is stored. If you provide a value for n, that value becomes the new packing value. If you specify an identifier, a name of your choosing, the identifier is associated with the new packing value.Each occurrence of a pack pragma with a pop argument retrieves the value at the top of an internal compiler stack and makes that value the new packing alignment. If you use pop and the internal compiler stack is empty, the alignment value is that set from the command-line and a warning is issued. If you use pop and specify a value for n, that value becomes the new packing value. If you use pop and specify an identifier, all values stored on the stack are removed from the stack until a matching identifier is found. The packing value associated with the identifier is also removed from the stack and the packing value that existed just before the identifier was pushed becomes the new packing value. If no matching identifier is found, the packing value set from the command line is used and a level-one warning is issued. The default packing alignment is 8.The new, enhanced functionality of the pack pragma allows you to write header files that ensure that packing values are the same before and after the header file is encountered:/* File name: include1.h
*/
#pragma pack( push, enter_include1 )
/* Your include-file code ... */
#pragma pack( pop, enter_include1 )
/* End of include1.h */In the previous example, the current pack value is associated with the identifier enter_include1 and pushed, remembered, on entry to the header file. The pack pragma at the end of the header file removes all intervening pack values that may have occurred in the header file and removes the pack value associated with enter_include1. The header file thus ensures that the pack value is the same before and after the header file.The new functionality also allows you to use code, such as header files, that uses pack pragmas to set packing alignments that differ from the packing value set in your code:#pragma pack( push, before_include1 )
#include "include1.h"
#pragma pack( pop, before_include1 )In the previous example, your code is protected from any changes to the packing value that might occur in include.h.
c/c++中 code generation struct member alignment 改为1 BYTE
(2)编译器特殊情况下的优化处理;
(3)Alignment的限制;
这里是(3)