C++的类大小
有以下C++类
#pragma pack(push)
#pragma pack(1)
class task /*:public OSThread*/{
//public:
// void Entry();
//private:
// int a;
// int b;
};
#pragma pack(pop)
sizeof(task) =1 去掉一字节对齐,sizeof(task)=1 ,所以说即使是一个空的类也会占用一个1字节,也必须占,如果不存在内存,那么这类就不存在了,也就无法实例化这个类了。
添加一个成员变量 sizeof的值
class task /*:public OSThread*/{
//public:
// void Entry();
//private:
int a;
// int b;
};
sizeof(task) =
占用4个字节,int占用4个字节,并不是4+1字节,理解:类必须存在内存中,而int a占用的地址足以表达类存放的地址(验证),所以表示1个字节的已经被优化掉,不需要!
其实该类的首地址就是int a地址了。
//验证
task* t;
t= new task();
t->a = ; std::cout<< std::hex << t << std::endl;
std::cout<< std::hex << &(t->a) << std::endl;
//两个输出相同的
推广一下到类的成员方法
class task/*:public OSThread*/{
public:
task(){};
// void Entry();
void my_test(void){
std::cout<< a <<std::endl;
}
//private:
int a;
int b;
// int b;
};
typedef void (task::*func)(void); //类成员函数指针
typedef void (*func1)(void); //普通函数指针
long l_func_addr;
void* funcAddr;
func t_func;
task* t;
t= new task();
t->a = ;
t_func = &task::my_test; //类方法地址
funcAddr = (void*&)(t_func); //强制转换
func1 func= reinterpret_cast<func1>(funcAddr); //强制转换
func(); //输出 3
l_func_addr = (long)func;
//输出类方法的地址,可见类方法的地址并不会成为类的首地址,类的方法地址是动态分配
std::cout<<std::hex << l_func_addr<< std::endl;
std::cout<<std::hex<<t_func<<std::endl;
//printf可以输出地址和 l_func_addr一样
printf("0x%x\n",t_func);
//
l_func_addr = (long)t;
std::cout<< std::hex << l_func_addr << std::endl;
(t->*t_func)();
std::cout<< std::hex << l_func_addr << std::endl;
//t的值和&(t->a)值一致,&(t->a) 与&(t->b)相差4个byte!
std::cout<< std::hex << t << std::endl;
std::cout<< std::hex << &(t->a) << std::endl;
std::cout<< std::hex << &(t->b) << std::endl;
总结:空类必然占用1byte的空间(标识类,类地址),类方法成员不在sizeof(类名)的计算内。类的成员变量会在sizeof在内,static修饰的也不在sizeof范围内。
C++的类大小的更多相关文章
- C++类大小
对于C++中类的大小,主要针对于无成员的空类大小,编译器会对该类进行优化,情况主要分为是否有虚表(虚函数)两种类型,对于无虚函数的类,该类大小均为1个字节(编译器插入一个char表示该类的存在),而出 ...
- c++类大小问题
1.空类 class A { }; 解析:类的实例化就是为每个实例在内存中分配一块地址:每个类在内存中都有唯一的标识,因此空类被实例化时,编译器会隐含地为其添加一个字节,以作区分. 2.虚函数类 cl ...
- C++类大小的计算
这里记录一下怎么计算类对象的大小. 大概总结下,类的大小需要考虑以下内容: 非静态成员变量大小 数据对齐到多少位 有无虚函数(即需不需要指向虚函数表的指针,如果考虑继承的情况,则还需要看继承了多少个指 ...
- 【整理】C++虚函数及其继承、虚继承类大小
参考文章: http://blog.chinaunix.net/uid-25132162-id-1564955.html http://blog.csdn.net/haoel/article/deta ...
- sizeof操作符-结构体与类大小
导读 sizeof是C/C++一个难点,当在自定义类上应用sizeof操作符时,总会出现意想不到的结果,下面,我们就来探讨一下sizeof这个操作符! 目录 1. sizeof与strlen的区别 2 ...
- C++空类大小
class a {};class b{};class c:public a{ virtual void fun()=0;};class d:public b,public c{}; 类a,b明明是空类 ...
- 由于jsp include 很多文件后导致java类大小超过65535 bytes 的解决方法(转载)
昨天,我遇到了一個讓我很頭疼的問題. 我做了一個共通的jsp,單只測它是ok的,可是,放在別的jsp中include它,就會報錯如標題所示:The code of method _jspService ...
- 类的大小——sizeof 的研究
类的大小——sizeof 的研究(1) 先看一个空的类占多少空间? class Base { public: Base(); ~Base(); }; 注意到我这里显示声明了构造跟析构,但是sizeof ...
- C++类对象大小的计算
(一)常规类大小计算 C++类对象计算需要考虑很多东西,如成员变量大小,内存对齐,是否有虚函数,是否有虚继承等.接下来,我将对此举例说明. 以下内存测试环境为Win7+VS2012,操作系统为32位 ...
随机推荐
- Java如何获取本地计算机的IP地址和主机名?
在Java编程中,如何获取本地计算机的IP地址和主机名? 以下示例显示如何使用InetAddress类的getLocalAddress()方法获取系统的本地IP地址和主机名. package com. ...
- Linux软件源
Kali科大软件源: vim /etc/apt/sources.list 下面的粘帖进去. deb http://mirrors.ustc.edu.cn/kali kali main non-free ...
- Mybatis(一)走进Mybatis与FisrtExample
前言 一直在使用,从未系统的总结起来.所以这里给大家带来的是mybatis的总结,系统大家能够对这个框架有一定的系统的学习与认识. mybatis和Hibernate应该是现在主流的ORM框架了. m ...
- Java8学习笔记(九)--日期/时间(Date Time)API指南
Java 8日期/时间( Date/Time)API是开发人员最受追捧的变化之一,Java从一开始就没有对日期时间处理的一致性方法,因此日期/时间API也是除Java核心API以外另一项倍受欢迎的内容 ...
- Redis数据库高级实用特性:持久化机制
Redis数据库高级实用特性:持久化机制 大型web系统数据缓存设计 Redis高级特性:虚拟内存的使用技巧 Redis高级实用特性:安全性与主从复制 Memcached.Redis OR Tair
- Git错误:error: The following untracked working tree files would be overwritten by merge:
[andy@localhost weixin_robot]$ git pull Updating d652d1c..fa05549 error: The following untracked wor ...
- [Python] 08 - Classes --> Objects
故事背景 一.阶级关系 1. Programs are composed of modules.2. Modules contain statements.3. Statements contain ...
- vue中引入jquery
npm install jquery -S 在webpack.base.conf.js里加入 plugins: [ new webpack.optimize.CommonsChunkPlugin('c ...
- 修改Ubuntu的aptget源为阿里源的方法
1.复制原文件备份sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 2.编辑源列表文件 sudo vim /etc/apt/sources ...
- php MongoDB driver 查询实例
//是否只查mx $mx_on_switch = I("post.mx_on_switch"); //mx模糊查询 $mx_vague_check = I("post.m ...