概述
c 为 0, c++ 为 1;
c++规定了空结构体和空类所占内存大小为1,即任何不同的对象有不相同的内存地址。c++的每个实例在内存中有唯一的地址。
比较一下c 和 c++ 的反汇编代码,从编译器层面来看一下。
/* c */
#include <stdio.h>
struct a
{
};
struct b
{
void (*max)(int a, int b);
void (*min)(int a, int);
};
int main()
{
printf("%dn", sizeof(struct a)); /* 0 */
printf("%dn", sizeof(struct b)); /* 8 */
}
#if 0
08048430 <main>:
8048430: 55 push %ebp ; 保存旧的栈顶值
8048431: 89 e5 mov %esp,%ebp ; ebp指向栈顶
8048433: 83 e4 f0 and $0xfffffff0,%esp ; 令栈地址(ESP的值)向16字节边界对齐(成为16的整数倍)
8048436: 83 ec 10 sub $0x10,%esp ; 分配栈空间
8048439: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) ; 第二个参数, esp+4 = 0
8048440: 00
8048441: c7 04 24 04 85 04 08 movl $0x8048504,(%esp) ; 第一个参数, "%d"
8048448: e8 a3 fe ff ff call 80482f0 <printf@plt> ; 调用printf
804844d: c7 44 24 04 08 00 00 movl $0x8,0x4(%esp) ; 第二个参数, esp+4 = 8
8048454: 00
8048455: c7 04 24 04 85 04 08 movl $0x8048504,(%esp) ; 第一个参数, "%d"
804845c: e8 8f fe ff ff call 80482f0 <printf@plt> ; 调用printf
8048461: c9 leave
8048462: c3 ret
#endif
/* c++ */
#include <iostream>
#include <stdio.h>
struct a
{
};
struct b
{
void max(int a, int b)
{
}
void min(int a, int)
{
}
};
int main()
{
printf("%dn", sizeof(struct a)); /* 1 */
printf("%dn", sizeof(struct b)); /* 1 */
}
#if 0
080485e0 <main>:
80485e0: 55 push %ebp ; 保存旧的栈顶值
80485e1: 89 e5 mov %esp,%ebp ; ebp指向栈顶
80485e3: 83 e4 f0 and $0xfffffff0,%esp ; 令栈地址(ESP的值)向16字节边界对齐(成为16的整数倍)
80485e6: 83 ec 10 sub $0x10,%esp ; 分配栈空间
80485e9: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) ; 第二个参数, esp+4 = 1
80485f0: 00
80485f1: c7 04 24 14 87 04 08 movl $0x8048714,(%esp) ; 第一个参数, "%d"
80485f8: e8 c3 fe ff ff call 80484c0 <printf@plt> ; 调用printf
80485fd: c7 44 24 04 01 00 00 movl $0x1,0x4(%esp) ; 第二个参数, esp+4 = 1
8048604: 00
8048605: c7 04 24 14 87 04 08 movl $0x8048714,(%esp) ; 第一个参数, "%d"
804860c: e8 af fe ff ff call 80484c0 <printf@plt> ; 调用printf
8048611: b8 00 00 00 00 mov $0x0,%eax ; 返回值0
8048616: c9 leave
8048617: c3 ret
#endif
最后
以上就是高挑服饰为你收集整理的c++ 空struct大小的全部内容,希望文章能够帮你解决c++ 空struct大小所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复