The Semantics of Data
2011-11-19 15:23
375 查看
第三章 前言 讨论 class的大小问题
其继承关系为:
结果:
xiaobo@xiaobo-desktop:~/桌面/c++$ g++ model3.1.cpp -o model3.1
xiaobo@xiaobo-desktop:~/桌面/c++$ ./model3.1
X:1
Y:4
Z:4
A:8
以上结果不同的编译器会有不同,有的编译器会产生 1 ,8 , 8 , 12的结果
首先讨论第一种结果 VC和g++上的结果均为1,4,4,8,
X的大小为1,是因为编译器安插进去一个char,这样会使得这个class的两个object 在内存中的配置独一无二,
例如:
Y Z分别拥有一个指向virtual base class X subobject的指针 所以大小为4
A的大小为
内存布局如下图:
这类编译器把一个empty virtual base class视为derived class object的开头部分,不花费任何额外空间
这也证实了一个virtual base class subobject只会在derived class中存在一份实体,不管它在继承体系中出现了多少次。
有一类编译器会得出 1,8,8,12的结果 主要是因为它给空的Y,Z,A均加上了char ,这样Y,Z,A 分别为5,5,9,又编译器有Alignment机制会将数值调整到整数倍(31位机为4bytes的整数倍)所以为8,8,12。
3.2 Data Member Layout
X:12
Y:16
Z:16
A:20
different
0xbf9bbfc4
0x804a038
0xbf9bbfc8
0xbf9bbfc4
---0xbf9bbfc4----x
#include"iostream" using namespace std; class X{}; class Y:public virtual X{}; class Z:public virtual X{}; class A:public Y,public Z{}; int main() { cout<<"X:"<<sizeof(X)<<endl; cout<<"Y:"<<sizeof(Y)<<endl; cout<<"Z:"<<sizeof(Z)<<endl; cout<<"A:"<<sizeof(A)<<endl; }
其继承关系为:
结果:
xiaobo@xiaobo-desktop:~/桌面/c++$ g++ model3.1.cpp -o model3.1
xiaobo@xiaobo-desktop:~/桌面/c++$ ./model3.1
X:1
Y:4
Z:4
A:8
以上结果不同的编译器会有不同,有的编译器会产生 1 ,8 , 8 , 12的结果
首先讨论第一种结果 VC和g++上的结果均为1,4,4,8,
X的大小为1,是因为编译器安插进去一个char,这样会使得这个class的两个object 在内存中的配置独一无二,
例如:
X a, b; if(&a!=&b)cout << "different";
Y Z分别拥有一个指向virtual base class X subobject的指针 所以大小为4
A的大小为
内存布局如下图:
这类编译器把一个empty virtual base class视为derived class object的开头部分,不花费任何额外空间
这也证实了一个virtual base class subobject只会在derived class中存在一份实体,不管它在继承体系中出现了多少次。
有一类编译器会得出 1,8,8,12的结果 主要是因为它给空的Y,Z,A均加上了char ,这样Y,Z,A 分别为5,5,9,又编译器有Alignment机制会将数值调整到整数倍(31位机为4bytes的整数倍)所以为8,8,12。
3.2 Data Member Layout
using namespace std; class X{ public: void getAddress() const {cout<<&x1<<endl; cout<<&m<<endl; cout<<&x3<<endl;} int getChunk() const {return chunkSize;} private: int x1; // static int m; static const int chunkSize = 10; double x3; };
#include"iostream" #include"stdio.h" using namespace std; class X{ public: void setA(int x){x1 = x;} void setB(int x){ m = x ;} void getAddress() const {cout<<&x1<<endl; cout<<&m<<endl; cout<<&x3<<endl;} int getChunk() const {return chunkSize;} private: int x1; static int m; static const int chunkSize = 10; double x3; }; class Y:public virtual X{}; class Z:public virtual X{}; class A:public Y,public Z{}; int X::m = 1; int main() { //X::m = 3; cout<<"X:"<<sizeof(X)<<endl; cout<<"Y:"<<sizeof(Y)<<endl; cout<<"Z:"<<sizeof(Z)<<endl; cout<<"A:"<<sizeof(A)<<endl; X a,b; a.setA(10); a.setB(12); a.setB(12); if(&a!=&b)cout << "different"<<endl; a.getAddress(); cout<<&a<<endl; printf("---%p----",&a); }
X:12
Y:16
Z:16
A:20
different
0xbf9bbfc4
0x804a038
0xbf9bbfc8
0xbf9bbfc4
---0xbf9bbfc4----x
相关文章推荐
- c++对象模型-the semantics of data
- Notes of “Quotient Cube: How to Summarize the Semantics of a Data Cube”
- Inside The C++ Object Model ---- The Semantics of Data
- inside the C++ object model chapter 3 the semantics of data
- Inside The C++ Object Model ---- The Semantics of Data
- The Semantics of Data
- 基本语言细节--《深度探索C++对象模型》--(3)The Semantics of Data--总结点
- 【NDN IoT】Caching in Named Data Networking for the Wireless Internet of Things 全文翻译
- Grounding Data Converters and Solving the Mystery of "AGND" and "DGND"
- Transferring Data Without Draining the Battery - Minimizing the Effect of Regular Updates
- InnoDB: auto-extending data file ./ibdata1 is of a different size 640 pages (rounded down to MB) than specified in the .cnf file: initial 768 pages, max 0 (relevant if non-zero) pages!
- js - SyntaxError: JSON.parse: unexpected character at line 1 column 2 of the JSON data jquery-1.9.1.min.js:3:4315
- System.Data - System.Reflection.ReflectionTypeLoadException: Unable to load one or more of the r
- ADO.NET Entity Framework: The version of SQL Server in use does not support datatype 'datetime2'
- An Analysis of Data Corruption in the Storage Stack
- Kettle解析JSON错误,We MUST have the same number of values for all paths,We can not find and data with path [$.
- 大数据阶乘(The factorial of large data)
- 深度学习:Hinton_Science_Reducing the dimensionality of data with neural networks
- Please make sure the TESSDATA_PREFIX environment variable is set to the parent directory of your "te
- The content of elements must consist of well-formed character data or markup.