C++ sizeof(class A)内里的问题

作者&投稿:芝裴 (若有异议请与网页底部的电邮联系)
请教C++ sizeof问题:这个class的大小为什么是24而不是20~

#include using namespace std;class C //类指针占一位啊,那么对齐就是24了{};int main(){ cout<<sizeof(C)<<endl; return 0;}

在C/C++中,sizeof是操作符而不是函数,所以那对()不是必须的,在没有歧意时可以不写。sizeof操作符用来检测系统为跟在后面的变量、类型符分配了多少个字节。下面的代码可帮助理解:

//#include "stdafx.h"//If the vc++6.0, with this line.#include "stdio.h"int main(void){ char x,*p=&x; printf("%d
",sizeof p);//输出4,说明系统为p分配了4字节来存放x的地址 printf("%d
",sizeof *p);//输出1,说明系统为*p分配了1字节,也就是为x分配了1字节 printf("%d
",sizeof x);//与上一行比较 return 0;}

1.如果class A没有成员,那么n=1;
这个是有历史原因的。理由是n=1是为了说明不同的对象在内存中的地址是不同的。
可以参考一下Lippman(第一个c++编译器cfront的设计者)写的一本书,叫<<Inside The C++ Object Model>>(中文版是台湾著名的侯捷翻译的,书面叫《深度探索C++对象模型》)

2.unsigned short类型不是2字节的吗?怎么会输出32?
为了内存对齐,便于快速访问。这是你编译器中设置的,你也可以在文件最前面加上
#pragma pack(1)
那么得到的结果就是你想象中的那个值。 你也可以自己把1设置成2,4,8什么的

3.析构函数怎么是占4个字节?
不是析构函数占4个字节,是因为你的析构函数有virtual(虚函数)修饰,那么这个类就会有一个虚函数表(是一个指针),指针的大小32位机器就是4,64位机器是8. 如果你把virtual去掉,就不会有这个虚函数表指针了

========
看来基础功不够扎实,还要好好学习啊。

n = sizeof(A); // 这一句貌似不是很合适哦

A apple ;
n = sizeof( apple );


广陵区19596347195: c++ sizeof用法 -
野耍盐酸: 一、由几个例子说开去.第一个例子:char* ss = "0123456789"; sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针 sizeof(*ss) 结果 1 ===》*ss是第一个字符char ss[] = "0123456789"; sizeof(ss) 结果 11 ===》ss是数组,计算到\0位...

广陵区19596347195: 在C++中,使用sizeof得到类的内存 -
野耍盐酸: 如果class A没有成员,那么sizeof a结果为1.理由是sizeof a=1是为了说明不同的对象在内存中的地址是不同的.可以参考一下Lippman的一本书,>(中文版是台湾著名的侯捷翻译的,书面叫《深度探索C++对象模型》)

广陵区19596347195: c++ sizeof()函数 -
野耍盐酸: 先给你看一下转义字符和它对应的意义:转义字符 转义字符的意义 \n 回车换行 \t 横向跳到下一制表位置 \b 退格 \r 回车 \f 走纸换页 \\ 反斜线符"\" \' 单引号符 \” 双引号符 \a 鸣铃 \ddd 1~3 位八进制数所代表的字符 \xhh 1~2 位十六进制数所代表的字符 s 在内存的存放:a //存放a b //存放b \023 //存放八进制为 23 的数4 //存放 4 \\ //存放反斜线符 \ \n //存放换行7 //存放 79 //存放 9 sizeof(s) 是求指针s本身的大小,一般是4 strlen(s) 才是求s指向的字符串的长度,这里是8

广陵区19596347195: C++中类的sizeof问题
野耍盐酸: 空类大小等于1是因为编译器为了区分不同的类,在类中加的一个char型. sizeof()求得的是类本身的大小,成员函数(不管是否虚拟都不会存储在类对象中,对 class A 的对象 a 的成员 a.Func(args); 的调用相当于 A::Func(args,&amp;a); 对于包含虚拟函数的类对象来说,增加了一个指向 vtable 的指针,即比数据成员的空间多用 4byte .虚拟函数的函数体仍然是一份. 类C、D增加了函数指针,而E中增加了父类指针,指针的大小为4,所以类大小为4,F中即有指向父类的指针,又有函数指针,所以大小为8. 建议看一下&lt;&lt;深度探索c++对象模型&gt;&gt;这本书

广陵区19596347195: C语言,sizeof函数测什么,具体用法怎么用 -
野耍盐酸: sizeof()用来测给定的数据类型在内存中占的字节长度; 比如我想知道int类型变量占几个字节 就这样使用:len = sizeof(int) 就可以了,len就是int型变量在内存中字节数; 当然你也可以这么用 int a; len = sizeof(a); 编译器会知道a是int型变量的,会自动换成sizeof(int); 另外 自己定义的数据类型也可以用sizeof来求字节数,比如定义了一个类class A{...},然后你 这样用:len = sizeof(A),就能知道A占了几个字节; 最后,提示下,sizeof是关键字或者说是运算符,不是函数,它的结果是编译的时候就确定了的,没有函数调用;

广陵区19596347195: c++ sizeof class问题 -
野耍盐酸: 1 4 4 16,当然环境不同,会有不同.第一个是1 是因为空类要占一个字节,是为了能够定义该类的不同对象. B是int 一般是4个字节. C因为不是空类 所以也是按int来. D是因为一个int占4个字节,一个virtual需要占用一个虚指针的大小,我的是64位,所以是占了8位.根据内存补齐原则 4字节的int 加上4字节的补齐 加上8字节的指针大小 为16. 还是需要看具体环境.

广陵区19596347195: C++ sizeof 相当于C#的什么方法 -
野耍盐酸: C#也有,不过是在非安全代码里使用,用法和C++一样的.sizeof是计算大小的,和内存相关,但C#的安全代码是要运行在.net上的,是托管的,不用自己去管理内存,所以根本不需要使用sizeof.至于非安全代码怎么使用,搜索C# unsafe

广陵区19596347195: C++ sizeof(class A)内里的问题 -
野耍盐酸: 1.如果class A没有成员,那么n=1;这个是有历史原因的.理由是n=1是为了说明不同的对象在内存中的地址是不同的.可以参考一下Lippman(第一个c++编译器cfront的设计者)写的一本书,叫<<Inside The C++ Object Model>>(中文版是台湾...

广陵区19596347195: C++ sizeof(类)的大小?
野耍盐酸: 类的大小主要和其成员变量以及虚拟函数指针有关,与普通成员函数无关 A没有任何成员变量和虚拟函数,相当于空类,内存中用1字节表示 B和C都虚拟继承A,因此都有一个虚拟继承表指针,因此大小为该指针大小4 D有两个虚拟继承表指针,因此大小为8

广陵区19596347195: 一段C++程序关于sizeof()的问题,希望牛人解答 -
野耍盐酸: 1.int是4,这个是在32位机器上显示的,如果是64位机器就不一定是了,2.这个类里有一个成员,而且是int型,所以,他的大小是4.也是32位机器3和4.有虚函数的类,内部有...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网