sizeof操作符的一些例子
例一:
#include <iostream>
using namespace std; class A
{
public:
char c;
}; class B
{
public:
int a;
short b;
}; class C
{
public:
int a;
short b;
char c;
}; class D
{
public:
int a;
short b;
char c;
char d;
}; class E
{
public:
int a;
short b;
char c;
char d;
char e;
}; int main()
{
cout<< "sizeof(A) = " <<sizeof(A) << endl;
cout<< "sizeof(B) = " <<sizeof(B) << endl;
cout<< "sizeof(C) = " <<sizeof(C) << endl;
cout<< "sizeof(D) = " <<sizeof(D) << endl;
cout<< "sizeof(E) = " <<sizeof(E) << endl;
return ;
}
输出:
这里是32位机器,sizeof(B)=8,sizeof(C)=8,sizeof(E)=12的原因是字节对齐,编译器会在最末一个成员之后填充字节。
例二:
#include <iostream>
using namespace std; class Base
{
public:
Base(int x) : a(x)
{}
void print()
{
cout << "Base" << endl;
}
private:
int a;
}; class Derived : public Base
{
public:
Derived(int x) : Base(x - ), b(x)
{}
void print()
{
cout << "Derived" << endl;
}
private:
int b;
}; class A
{
public:
A(int x) : a(x)
{}
virtual void print()
{
cout << "A" << endl;
}
private:
int a;
}; class B : public A
{
public:
B(int x) : A(x - ), b(x)
{}
virtual void print()
{
cout << "B" << endl;
}
private:
int b;
}; int main()
{
cout<< "sizeof(Base) = " <<sizeof(Base) << endl;
cout<< "sizeof(Derived) = " <<sizeof(Derived) << endl;
cout<< "sizeof(A) = " <<sizeof(A) << endl;
cout<< "sizeof(B) = " <<sizeof(B) << endl;
return ;
}
输出:
sizeof(Base)=4,int占4字节,print()函数不占内存;
sizeof(Derived)=8,比Base多一个int成员;
sizeof(A)=8,int占4字节,但是含有虚函数,包含了一个隐含的虚表指针成员,占4字节,共计8字节;
sizeof(B)=12,比A多一个int成员,共计12字节;
这里可能会存在一个疑问:B中也存在一个指向虚函数表的指针,所以应该是16字节。
解释:虚表指针(vptr)是作为对象的一部分存在于对象的空间中,一个类只有一个虚表指针,所以A中的虚表指针和B中的虚表指针是同一个,所以是12字节。
例三:
#include <iostream>
using namespace std; class A
{
}; class B
{
}; class C : public A, public B
{
}; class D : virtual public A
{
}; class E : virtual public A, virtual public B
{
}; class F : public D
{
}; class G
{
public:
int a;
static int b;
}; int main()
{
cout<< "sizeof(A) = " <<sizeof(A) << endl;
cout<< "sizeof(B) = " <<sizeof(B) << endl;
cout<< "sizeof(C) = " <<sizeof(C) << endl;
cout<< "sizeof(D) = " <<sizeof(D) << endl;
cout<< "sizeof(E) = " <<sizeof(E) << endl;
cout<< "sizeof(F) = " <<sizeof(F) << endl;
cout<< "sizeof(G) = " <<sizeof(G) << endl;
return ;
}
输出:
sizeof(A) = 1,类A是空类,编译器会安插一个char空类,标记它的每一个对象,因此为1字节;
sizeof(B) = 1,同上;
sizeof(C) = 1,类C多重继承类A和类B,大小仍然为1字节;
sizeof(D) = 4,类D虚继承自A,编译器安插了一个指向父类的指针,大小为4字节;
sizeof(E) = 4,类E虚继承自A和B,因此它有指向父类A和父类B的指针,加起来为8字节。注意:在GNU编译器下编译字节是4字节;
sizeof(F) = 4,类F继承D,大小为4字节;
sizeof(G) = 4,类G有一个static成员,这个静态成员不在类的实例中,而是像全局变量一样在静态存储区中,被类G共享,所以只计算一个int成员,为4字节;
PS:如果在A中加入char a;
输出:sizeof(D) = 8 sizeof(E) = 8 sizeof(F) = 8 ,理由是字节对齐。
例四:
#include <iostream>
using namespace std; union u1
{
double a;
int b;
}; union u2
{
char a[];
int b;
}; union u3
{
char a[];
char b;
}; int main()
{
cout<< "sizeof(u1) = " <<sizeof(u1) << endl;
cout<< "sizeof(u2) = " <<sizeof(u2) << endl;
cout<< "sizeof(u3) = " <<sizeof(u3) << endl;
return ;
}
输出:
这里定义了三个联合体。联合体的大小取决于它所有成员中占用空间最大的一个成员的大小。对于符合数据类型,例如union,struct,class,对齐方式为成员中最大成员的对齐方式。
sizeof(u1) = 8,最大成员为double a,为8;
sizeof(u2) = 16,最大成员是char[13]的数组,但由于另一个成员int b,使u2的对齐方式变成4,所以u2的大小为4的倍数,所以占用的空间由13对齐成16;
sizeof(u3) = 13,最大成员是char[13]的数组,另一个成员char b,所以大小为13;
例五:(查看32位和64位机器字节大小)
#include <iostream>
using namespace std; int main()
{
cout<< "sizeof(char) = " <<sizeof(char) << endl;
cout<< "sizeof(short) = " <<sizeof(short) << endl;
cout<< "sizeof(int) = " << sizeof(int) <<endl;
cout<< "sizeof(double) = " <<sizeof(double) << endl;
cout<< "sizeof(long) = " <<sizeof(long) << endl;
cout<< "sizeof(longlong) = " <<sizeof(long long) << endl; cout<< "sizeof(void*) = " << sizeof(void*) <<endl;
cout<< "sizeof(char*) = " << sizeof(char*) <<endl; cout<< "当前系统是sizeof(void*) * 8 = " << sizeof(void*)*<<"位"<<endl; return ;
}
32位输出:
64位输出:
sizeof(char) = 1
sizeof(short) = 2
sizeof(int) = 4
sizeof(double) = 8
sizeof(long) = 8
sizeof(longlong) = 8
sizeof(void*) = 8
sizeof(char*) = 8
当前系统是sizeof(void*) * 8 = 64位
说明:
1.long型变量在32位是4字节,64位是8字节
2.指针变量在32位是4字节,64位是8字节
sizeof操作符的一些例子的更多相关文章
- sizeof操作符-结构体与类大小
导读 sizeof是C/C++一个难点,当在自定义类上应用sizeof操作符时,总会出现意想不到的结果,下面,我们就来探讨一下sizeof这个操作符! 目录 1. sizeof与strlen的区别 2 ...
- C语言strlen函数和sizeof操作符
字符'x'于字符串"x"的区别 'x' 属于基本类型(char)字符类型-----------------由1个字符组成('x') "x"属于派生类型(char ...
- C++ sizeof操作符的用法和strlen函数的区别
摘要:本人首先介绍了C++中sizeof操作符的用法和注意事项,其次对比了和strlen的区别和使用,方便大家在写代码的时候查阅,和面试.笔试的时候复习. 目录: sizeof的用法: sizeof和 ...
- 字符串 前篇 ---- sizeof()操作符和strlen()库函数
本文不是研究sizeof(), strlen() 的深奥定义和原理,我们不会在理论上太过钻牛角尖.希望读这篇文章的你,也不要太过抠概念(不要拘泥于语法).我们只做 实用意义 的介绍和讨论. 在介绍字符 ...
- C++中sizeof操作符与strlen函数
sizeof操作符: sizeof是一个操作符,返回一条表达式或一个类型名字所占的字节数.返回值一个常量表达式,类型为size_t. size_t sizeof(type) size_t sizeof ...
- C++ sizeof 操作符的用法总结
在VC中,sizeof有着许多的用法,而且很容易引起一些错误.下面根据sizeof后面的参数对sizeof的用法做个总结. A.参数为数据类型或者为一般变量: 例如sizeof(int),sizeof ...
- C安全问题与指针误用
欢迎关注我的个人博客:www.wuyudong.com, 更多精彩文章与您分享 指针的声明与初始化 1.不恰当的指针声明 考虑如下的声明: int* ptr1, ptr2; // ptr1为指针,pt ...
- Strcmp(字符串1,字符串2)函数 Sizeof && strlen() Substr(a,b)
Strcmp(字符串1,字符串2)函数 { strcmp函数是比较两个字符串的大小,返回比较的结果.一般形式是: i=strcmp(字符串,字符串); 其中,字符串1.字符串2均可为字符串常量或变量 ...
- sizeof和strlen的区别
一.sizeof sizeof(...)是运算符,而不是一个函数. sizeof操作符的结果类型是size_t,在头文件中typedef为unsigned int,其值在编译时即计算好了, ...
随机推荐
- [转] 扩展微信小程序框架功能
通过第三方 JavaScript 库,扩展微信小程序框架功能. 扩展微信小程序框架功能(1)——Promise ES6 对 Promise 有了原生的支持,但微信开发者工具更新版本(0.11.1122 ...
- day14.生成器进阶,推导式
生成器中取值的三种方法 方法1:next() 方法2:for 循环 方法3:数据类型的强制转换 def func(): for i in range(20): yield '赛车*{}'.format ...
- pyqt pyside QLineEdit 重写键盘事件
pyqt pyside QLineEdit 重写键盘事件 def keyPressEvent(self, event): if (event.modifiers() & QtCore.Qt.S ...
- js事件循环机制 (Event Loop)
一.JavaScript是单线程单并发语言 什么是单线程 主程序只有一个线程,即同一时间片断内其只能执行单个任务. 为什么选择单线程? JavaScript的主要用途是与用户互动,以及操作DOM.这决 ...
- 我的第二本译作《精通OpenStack》上架啦:书籍介绍和译者序
1. 书籍简介 英文书名:Mastering OpenStack Second Edition 作者:[德] 奥马尔-海德希尔(Omar Khedher)[印] 坚登-杜塔-乔杜里(Chanda Du ...
- C# 默认访问修饰符
c# 中类,成员,枚举,结构等默认访问修饰符是? 根据MSDN文档有: [MSDN] Classes and structs that are not nested within other clas ...
- webpack报错需要合适的loader
以前做vue项目都好好的,最近做react,公共配置感觉加个jsx就可以了吧,然而不是这样的. 一.问题描述 You may need an appropriate loader to handle ...
- 移动端click事件出现300ms延迟
问题分析: 双击缩放是指手在屏幕上快速点击两次,iOS自带的Safari浏览器会将网页缩放至原始比例.当用户在屏幕上单击某元素时,浏览器会先捕获此处单击,但浏览器不知道用户是要单击链接还是要双击该部分 ...
- Vim使用心得
马上就要联赛啦. 学习一下vim 这是一个vim文档 http://vimcdoc.sourceforge.net/doc/ 这是一个优秀的vimrc配置 http://www.cnblogs.com ...
- __x__(32)0908第五天__Photoshop的基本操作
1. 设置 Photoshop 的单位为 像素px 2. 标尺 显示与隐藏 Ctrl + r 3. 放大与缩小 Ctrl + 1 放大到100% Ctrl + 0 适应屏幕 Alt + ...