sizeof

转:C++中的类所占内存空间总结

老子叫甜甜 提交于 2020-03-09 20:38:23
类所占内存的大小是由成员变量 (静态变量除外 )决定的, 成员函数(这是笼统的说,后面会细说) 是不计算在内的。 摘抄部分 : 成员函数还是以一般的函数一样的存在。a.fun()是通过fun(a.this)来调用的。所谓成员函数只是在名义上是类里的。其实成员函数的大小不在类的对象里面, 同一个类的多个对象共享函数代码。而我们访问类的成员函数是通过类里面的一个指针实现 , 而这个指针指向的是一个table,table里面记录的各个成员函数的地址 (当然不同的编译可能略有不同的实现)。所以我们访问成员函数是间接获得地址的。所以这样也就增加了一定的时间开销,这也就是为什么我们提倡把一些简短的,调用频率高的函数声明为inline形式(内联函数)。 (一) class CBase { }; sizeof(CBase)=1; 为什么空的什么都没有是1呢? c++要求每个实例在内存中都有独一无二的地址 。//注意这句话!!!!!!!!!! 空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。所以空类的sizeof为1。 (二) class CBase { int a; char p; }; sizeof(CBase)=8; 记得 对齐的问题 。int 占4字节//注意这点和struct的对齐原则很像!!!!! char占一字节,补齐3字节 (三)

C++中的类所占内存空间总结

眉间皱痕 提交于 2020-03-09 17:12:42
转自 http://blog.csdn.net/wangjiang19/article/details/6750501 类所占内存的大小是由成员变量 (静态变量除外 )决定的,成员函数(这是笼统的说,后面会细说)是不计算在内的。 摘抄部分 : 成员函数还是以一般的函数一样的存在。a.fun()是通过fun(a.this)来调用的。所谓成员函数只是在名义上是类里的。其实成员函数的大小不在类的对象里面,同一个类的多个对象共享函数代码。而我们访问类的成员函数是通过类里面的一个指针实现,而这个指针指向的是一个table,table里面记录的各个成员函数的地址(当然不同的编译可能略有不同的实现)。所以我们访问成员函数是间接获得地址的。所以这样也就增加了一定的时间开销,这也就是为什么我们提倡把一些简短的,调用频率高的函数声明为inline形式(内联函数)。 (一) class CBase { }; sizeof(CBase)=1; 为什么空的什么都没有是1呢? c++要求每个实例在内存中都有独一无二的地址 。//注意这句话!!!!!!!!!! 空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。所以空类的sizeof为1。 (二) class CBase { int a; char p; }; sizeof(CBase)=8; 记得 对齐的问题

C++中的类所占内存空间总结

帅比萌擦擦* 提交于 2020-03-09 17:10:02
说明:此博文转载之 http://blog.sina.com.cn/s/blog_69c189bf0100mkeu.html 类所占内存的大小是由成员变量( 静态变量除外 )决定的, 成员函数(这是笼统的说,后面会细说) 是不计算在内的。 摘抄部分: 成员函数还是以一般的函数一样的存在。 a.fun()是通过fun(a.this)来调用的 。所谓成员函数只是在名义上是类里的。 其实成员函数的大小不在类的对象里面,同一个类的多个对象共享函数代码。 而我们访问类的成员函数是通过类里面的一个指针实现,而这个指针指向的是一个table,table里面记录的各个成员函数的地址(当然不同的编译可能略有不同的实现)。所以我们访问成员函数是间接获得地址的。所以这样也就增加了一定的时间开销,这也就是为什么我们提倡把一些简短的,调用频率高的函数声明为inline形式(内联函数)。 (一) class CBase { }; sizeof(CBase)=1; 为什么空的什么都没有是1呢? c++要求每个实例在内存中都有独一无二的地址。// 注意这句话!!!!!!!!!! 空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。所以空类的sizeof为1。 (二) class CBase { int a; char p; }; sizeof(CBase)=8; 记得

C++类的实例化对象的大小之sizeof()

拟墨画扇 提交于 2020-03-09 17:03:45
之所以写这篇《C++类的实例化对象的大小之sizeof()》。是由于在參加笔试的时候遇到例如以下这么一道题,当时感觉就是这个一个坑,但。我还是义无反顾的跳了下去,由于存在知识点盲区啊。现,总结一下。你不知道的C++类的实例化对象的大小之sizeof()。 class D { public: D() { } virtual ~D() { } private: int a ; char *p; }; 实例一: class A { }; A a; cout << sizeof(a) << endl; 执行结果:1 解释:空类,没有不论什么成员变量或函数。即没有不论什么存储内容;可是由A a可知,空类仍然可以实例化。 一个类可以实例化,编译器就需给它分配内存空间,来指示类实例的地址 。这里编译器默认分配了一个字节,以便标记可能初始化的类实例。同一时候使空类占用的空间最少(即1字节)。 实例二: class B { private: int a; }; B b; cout << sizeof(b) << endl; 执行结果:4 解释:当类中有其他成员占领空间时,那一个字节就不算在内了,如本题:结果是4,而不是1+4=5。 实例三: class BB { private: int a ; char b; }; BB bb; cout << sizeof(bb) << endl; 执行结果:8

c++中各类型数据所占字节数(二)

这一生的挚爱 提交于 2020-03-09 10:45:59
转自: https://blog.csdn.net/allen_tony/article/details/76973906 https://blog.csdn.net/zzwdkxx/article/details/53635173 关于多个父类,虚继承,类本身自己的虚函数,情况比较复杂,后续时间再研究。 类所占内存的大小是由成员变量(静态变量除外)决定的,成员函数是不计算在内的。摘抄部分: 成员函数还是以一般的函数一样的存在。a.fun()是通过fun(a.this)来调用的。所谓成员函数只是在名义上是类里的。其实成员函数的大小不在类的对象里面,同一个类的多个对象共享函数代码。而我们访问成员函数是通过类里面的一个指针实现,而这个指针指向的是一个table,table里面记录的各个成员函数的地址(当然不同的编译可能略有不同的实现)。所以我们访问成员函数是间接获得地址的。所以这样也就增加了一定的时间开销,这也就是为什么我们提倡把一些简短的,调用频率高的函数声明为inline形式(内联函数)。 如果类定义了虚函数,该类及其派生类就要生成一张虚拟函数表,即vtable。而在类的对象地址空间中存储一个该虚表的入口,占4个字节,这个入口地址是在构造对象时由编译器写入的。 所以,由于对象的内存空间包含了虚表入口,编译器能够由这个入口找到恰当的虚函数,这个函数的地址不再由数据类型决定了。

C++(四十)— C++中一个class类对象占用多少内字节

笑着哭i 提交于 2020-03-09 10:43:15
  一个空的class在内存中多少字节?如果加入一个成员函数后是多大?这个成员函数存储在内存中什么部分?   一个Class对象需要占用多大的内存空间。最权威的结论是: 非静态成员变量总合。 加上编译器为了CPU计算,作出的 数据对齐处理。 加上为了 支持虚函数 ,产生的额外负担。   介绍完了理论知识后,再看看再找一个例子看看(注:一下所有结果都是在VC6.0 开发环境中得出的结论) 1、空类的Size   编译器在执行Car objCar;这行代码后需要,作出一个Class Car的Object。并且这个Object的地址还是独一无二的,于是编译器就会给空类创建一个隐含的一个字节的空间。 class Car { }; void main() { int size = 0; Car objCar; size = sizeof(objCar); printf("%s %d /r", "Class Car Size:", size); } 输出结果:Class Car Size:1 2、只有成员变量的Size (1)在32位系统中,整型变量占4个字节。这里Class Car中含有两个整型类型的成员变量,所以Class Size是8。 class Car { private: int nLength; int nWidth; }; void main() { int size = 0;

C++类所占内存大小计算

旧城冷巷雨未停 提交于 2020-03-09 10:41:23
C++类所占内存大小计算 转载时请注明出处和作者联系方式 文章出处: http://blog.csdn.net/chenchong08 作者联系方式: vision_chen@yeah.net 说明:笔者的操作系统是32位的。 class A {}; sizeof( A ) = ? sizeof( A ) = 1 明明是空类,为什么编译器说它是1呢? 空类同样可以实例化,每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.所以sizeof( A )的大小为1. class B { public: B() {} ~B() {} void MemberFuncTest( int para ) { } static void StaticMemFuncTest( int para ){ } }; sizeof( B ) = ? sizeof( B ) = 1 类的非虚成员函数是不计算在内的,不管它是否静态。 class C { C(){} virtual ~C() {} }; sizeof( B ) = ? sizeof( B ) = 4 类D有一个虚函数,存在虚函数的类都有一个一维的虚函数表叫虚表,虚表里存放的就是虚函数的地址了,因此,虚表是属于类的。这样的类对象的前四个字节是一

C++类所占内存大小计算

落花浮王杯 提交于 2020-03-09 10:29:22
C++类所占内存大小计算 文章出处:http://blog.csdn.net/chenchong08 作者联系方式:vision_chen@yeah.net 说明:笔者的操作系统是32位的。 class A {}; sizeof( A ) = ? sizeof( A ) = 1 明明是空类,为什么编译器说它是1呢? 空类同样可以实例化,每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.所以sizeof( A )的大小为1. class B { public: B() {} ~B() {} void MemberFuncTest( int para ) { } static void StaticMemFuncTest( int para ){ } }; sizeof( B ) = ? sizeof( B ) = 1 类的非虚成员函数是不计算在内的,不管它是否静态。 class C { C(){} virtual ~C() {} }; sizeof( B ) = ? sizeof( B ) = 4 类D有一个虚函数,存在虚函数的类都有一个一维的虚函数表叫虚表,虚表里存放的就是虚函数的地址了,因此,虚表是属于类的。这样的类对象的前四个字节是一个指向虚表的指针,类内部必须得保存这个虚表的起始指针

C++类所占内存大小计算

喜你入骨 提交于 2020-03-09 10:16:56
C++类所占内存大小计算 说明:笔者的操作系统是32位的。 class A {}; sizeof( A ) = ? sizeof( A ) = 1 明明是空类,为什么编译器说它是1呢? 空类同样可以实例化,每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.所以sizeof( A )的大小为1. class B { public: B() {} ~B() {} void MemberFuncTest( int para ) { } static void StaticMemFuncTest( int para ){ } }; sizeof( B ) = ? sizeof( B ) = 1 类的非虚成员函数是不计算在内的,不管它是否静态。 class C { C(){} virtual ~C() {} }; sizeof( B ) = ? sizeof( B ) = 4 类D有一个虚函数,存在虚函数的类都有一个一维的虚函数表叫虚表,虚表里存放的就是虚函数的地址了,因此,虚表是属于类的。这样的类对象的前四个字节是一个指向虚表的指针,类内部必须得保存这个虚表的起始指针。在32位的系统分配给虚表指针的大小为4个字节,所以最后得到类C的大小为4. class D { D(){} virtual ~D(

你必须知道的指针基础-4.sizeof计算数组长度与strcpy的安全性问题

独自空忆成欢 提交于 2020-03-09 07:23:36
一、使用sizeof计算数组长度 1.1 sizeof的基本使用   如果在作用域内,变量以数组形式声明,则可以使用sizeof求数组大小,下面一段代码展示了如何使用sizeof: int nums[] = {11,22,33,44,55,66}; int i; // sizeof(nums) 计算nums数组的总字节数 // sizeof(int) 计算int类型所占用的字节数 int length = sizeof(nums)/sizeof(int); for(i=0;i<length;i++) { printf("%d ",nums[i]); }   其中sizeof(nums)代表计算nums数组的总字节数,而sizeof(int)则代表计算int类型所占用的字节数(32位系统下是4个字节,64位下可能不同,因此这里使用sizeof(int)可以向程序员屏蔽这个差异),运行结果为: 1.2 sizeof只能在编译时计算   假如我们将上面的代码做一个抽象,将数组的遍历及打印封装为一个方法,代码如下: void printEach(int* nums) { // sizeof(nums)在这里是计算指针的字节数 int length = sizeof(nums)/sizeof(int); printf("The length of nums is %d\n",length);