读书人

麻烦看下这个sizeof是怎么回事?int为

发布时间: 2012-05-11 12:55:37 作者: rapoo

麻烦看下这个sizeof是咋回事?int为啥是7....
试了下sizeof类的大小,本来想着没问题吧,如下代码输出是1 2,

C/C++ code
#include <iostream>using namespace std;class A1{public:char a;    A1();    ~A1();};class B1: A1{    char b; //输出1 2。改成int b;后输出变成1 8了,为何?};void main(){cout << sizeof(A1) << endl;cout << sizeof(B1) << endl;}


但是问题来了,把子类里唯一的变量char b;改成int b;之后,输出变成1 8了,也就是说8-1=7是子类自身大小吗?
实在想不通.....
麻烦大家看下咋回事
谢谢

[解决办法]
C++记得不太清楚
类最小的sizeof为1.
第二个为8难道是结构体对齐?
求高手解释下
[解决办法]
是的,是结构体对齐
你可以发现子类的char b改成int b之后,如果在基类多加3个char 总共4个char 最后B的大小还是8
[解决办法]
《深度探索C++对象模型》一书详解。
[解决办法]
调整一下声明
class B1: A1
{
public:
int b; //声明为public
};

cout << offsetof(B1, b)<<endl;

你可以看到便宜的内存为4,所以就是8咯。看内存对齐,就用这个offsetof宏。
[解决办法]
这个和struct 对齐一样吧!!!第一个字节是子类的char 第二三四个字节为空!做到补齐!后面是int这个数的空间
[解决办法]
http://www.cnblogs.com/shitouer/archive/2010/04/07/1706785.html
[解决办法]
存储的时候为了对齐,int b;存储时从下一个机器字的开始进行存储,32为系统字长为4,第一个char虽然占一个字节,但是并不和b在一个机器字内存储
[解决办法]
google“对齐"先了解下内存对齐是怎么一回事。
[解决办法]
存在着结构体对齐这么个东西。为了高效的利用总线,一般机器都使内存对齐。32位机器一般都使用4字节对齐。你的A类里面只定义了char,所以只被赋予了一个字节的空间。当你定义了B类的时候,int的值需要排列在地址能被4整除的位置上,所以,在char的后面填充了写无用的字节。
[解决办法]
探讨

调整一下声明
class B1: A1
{
public:
int b; //声明为public
};

cout << offsetof(B1, b)<<endl;

你可以看到便宜的内存为4,所以就是8咯。看内存对齐,就用这个offsetof宏。

读书人网 >C++

热点推荐