int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T("错误: MFC 初始化失败\n"));
nRetCode = 1;
}
else
{
// TODO: 在此处为应用程序的行为编写代码。
int itmp = 3;
double dtmp = 1.1;
char ctmp = 'c';
bool btmp = false;
char s[]="123456789";
char d[]="1234567890123";
char z[] = "12345";
printf("%s,\n%s",d,s);
printf( "ptr_itmp:%x, ptr_dtmp:%x", &itmp, &dtmp );
cout<<"Finish!"<<endl;
}
return nRetCode;
}
问题是:
这些变量的内存大小如何分配的?是基于字节对齐机制?为什么ctmp的空间大小是9字节?
ps:所用编译器是VS2008:
6 个解决方案
#1
局部变量使用栈空间,四字节对齐,不过ctmp占9字节,没看见代码打印?
#2
用VS2008的 内存查看器 看出来ctmp占用了 9个字节,不知道为什么啊?这到底是什么机制啊?
#3
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?
不要写连自己也预测不了结果的代码!
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?
不要写连自己也预测不了结果的代码!
#4
VS2008的内存调试器说不定有bug啊,如果你sizeof(ctemp)还是9的话我就信
#5
要知道占用多少字节,请使用sizeof(d),不要试图通过相邻变量的起始地址推算。
#6
确实是一个很奇怪的现象,ctmp的位置与btmp的位置相距4,与dtmp的位置相距9.前者我可以理解,是为了对齐——尽管char类型不需要对齐,但后者就很难理解了,dtmp如果要对齐到64位边界,那应该最多与ctmp相距8才对啊。而且,栈是自上向下分配的,dtmp下面是不需要对齐的ctmp。更另人费解的是,dtmp没有被对齐到任何位置——它的地址是个奇数。
#1
局部变量使用栈空间,四字节对齐,不过ctmp占9字节,没看见代码打印?
#2
用VS2008的 内存查看器 看出来ctmp占用了 9个字节,不知道为什么啊?这到底是什么机制啊?
#3
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?
不要写连自己也预测不了结果的代码!
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?
不要写连自己也预测不了结果的代码!
#4
VS2008的内存调试器说不定有bug啊,如果你sizeof(ctemp)还是9的话我就信
#5
要知道占用多少字节,请使用sizeof(d),不要试图通过相邻变量的起始地址推算。
#6
确实是一个很奇怪的现象,ctmp的位置与btmp的位置相距4,与dtmp的位置相距9.前者我可以理解,是为了对齐——尽管char类型不需要对齐,但后者就很难理解了,dtmp如果要对齐到64位边界,那应该最多与ctmp相距8才对啊。而且,栈是自上向下分配的,dtmp下面是不需要对齐的ctmp。更另人费解的是,dtmp没有被对齐到任何位置——它的地址是个奇数。