#include <iostream>
#include <stdio.h>
struct a
{
};
struct b
{
void max(int a, int b)
{
}
void min(int a, int)
{
}
};
class c
{
};
class d
{
void max(int a, int b)
{
}
void min(int a, int)
{
}
};
int main()
{
printf("%d\n", sizeof(struct a)); /* 1 */
printf("%d\n", sizeof(struct b)); /* 1 */
printf("%d\n", sizeof(class c)); /* 1 */
printf("%d\n", sizeof(class d)); /* 1 */
}
#if 0
在C++语言中的确规定了空结构体和空类所占内存大小为1,即任何不同的对象不能拥有相同的内存地址。
而C语言中空类和空结构体占用的大小是0.
为了满足C++标准规定的不同对象不能有相同地址,C++编译器保证任何类型对象大小不能为0。
C++编译器会在空类或空结构体中增加一个虚设的字节(有的编译器可能不止一个),以确保不同的对象都具有不同的地址。
c++要求每个实例在内存中都有独一无二的地址。
空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。
所以空类的sizeof为1。
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