一、sizeof是什么?

  sizeof是一种预编译处理,不是函数,不是一元表达式。也即,作用阶段在编译期。

二、功能是什么?

  sizeof返回变量或类型的字节数。

三、调用方式

  sizeof(object):对对象使用
  sizeof(typename):对类型使用

四、返回值情况归类

  其实质是考察各个类型所占内存的相关知识

  基本数据类型:
    char(unsigned) 1
    short(unsigned) 2
    int(unsigned) long float 4
    double 8
  函数:
    返回值的类型
  指针:
    32位系统 4
    64位系统 8
  数组:
    数组的实际大小

五、重点:对齐问题下的sizeof
  各类型对界与其字节数一致。也即起始地址需要被对界整除。
  另外,对于复合数据类型,如union、struct、class,类型字节数是成员最大对界的整数倍。

  sizeof(union)
    基本大小由最大的元素决定,但最终大小为最大对界的整数倍
    

union u1
{
double a;
int b;
}; // union u2
{
char a[];
char b;
}; // union u3
{
char a[];
int b;
}; // 16,int类型的对界为4

  sizeof(class)
    包含虚函数的类,保存了指向虚函数表的指针,而一个指针为4个字节。

  sizeof(struct) 略微复杂
    struct类型的对界为成员中的最大对界,也即struct类型的字节数是对界的整数倍,同时起始地址也是对界的整数倍。

struct nalign
{
//基本成员类型
char a; //起始地址:0 占空空间:1
int b; //起始地址:4 占用空间:4
short c; //起始地址:8 占用空间:2
//总空间为10
//struct为4对界 总空间补全到12
}; struct nalign1
{
//struct类型作为成员的情形
//
char a; //对界:1 起始地址:0 占用空间:1
nalign b; //对界:4 起始地址:4 占用空间 12
//总空间为16
//struct为对界4 总空间补全到16
}; int main(int argc, char **argv)
{
cout << sizeof(nalign) << endl; // 输出"12"
cout << sizeof(nalign1) << endl; //输出"16"
}

 总结:
    在复合类型中,成员变量的对界为成员起始地址的整数倍;复合类型的对界为成员变量的最大对界;复合类型的大小为其对界的整数倍。

sizeof的用法与字节对齐的更多相关文章

  1. C语言中的字节对齐以及其相关处理

    首先,我们来了解下一些基本原理: 一.什么是字节对齐一个基本类型的变量在内存中占用n个字节,则该变量的起始地址必须能够被n整除,即: 存放起始地址 % n = 0,那么,就成该变量是字节对齐的;对于结 ...

  2. 【C语言】字节对齐(内存对齐)

    数据对齐 1.  对齐原则: [原则1]数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma p ...

  3. <摘录>字节对齐(强制对齐以及自然对齐)

    struct {}node; 32为的x86,window下VC下sizeof(node)的值为1,而linux的gcc下值为0: 一.WINDOWS下(VC--其实GCC和其原理基本一样,象这种问题 ...

  4. 转载:C语言的字节对齐及#pragma pack的使用

    C语言的字节对齐及#pragma pack的使用   C编译器的缺省字节对齐方式(自然对界) 在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间. 在结构中,编译器为结构的每个成员 ...

  5. sizeof 与 字节对齐

    转:http://baike.baidu.com/view/1356720.htm sizeof是运算符,可用于任何变量名.类型名或常量值,当用于变量名(不是数组名)或常量时,它不需要用圆括号.    ...

  6. 字节对齐&&sizeof

    转:http://blog.chinaunix.net/uid-722885-id-124878.html 1. sizeof应用在结构上的情况 请看下面的结构: struct MyStruct { ...

  7. pragma pack(非常有用的字节对齐用法说明)

    强调一点: #pragma pack(4) typedef struct { char buf[3]; word a; }kk; #pragma pack() 对齐的原则是min(sizeof(wor ...

  8. 关于sizeof与#pragma pack 以及网络上关于字节对齐的一点感想

    工作中面试中对于字节对齐基本上是必考一个知识点,而很多面试是网络上上原题.基本上背一背就可以写正确,而关于4字节对齐我相信很多人也只是一个基本地了解,对于一些题目就感觉有问题,而且很多blog后面仍然 ...

  9. stm32中使用#pragma pack(非常有用的字节对齐用法说明)

    #pragma pack(4)   //按4字节对齐,但实际上由于结构体中单个成员的最大占用字节数为2字节,因此实际还是按2字节对齐 typedef struct { char buf[3];//bu ...

随机推荐

  1. 基于Python语言使用RabbitMQ消息队列(五)

    Topics 在前面教程中我们改进了日志系统,相比较于使用fanout类型交易所只能傻瓜一样地广播,我们用direct获得了选择性接收日志的能力. 虽然使用direct类型交易所改进了我们的系统,但它 ...

  2. JavaScript6 新语法 let 有什么优势

    最近看国外的前端代码时,发现ES6的新特性已经相当普及,尤其是 let,应用非常普遍 虽然 let 的用法与 var 相同,但不管是语法语义上,还是性能上,都提升了很多,下面就从这两方面对比一下 语法 ...

  3. webpack 开发环境

    当项目逐渐变大,webpack 的编译时间会变长,可以通过参数让编译的输出内容带有进度和颜色. $ webpack --progress --colors 如果不想每次修改模块后都重新编译,那么可以启 ...

  4. 修改Linux安装软件镜像源为阿里云

    CentOS系统更换软件安装源: 第一步:安装wget.如果你的系统已安装了wget可以直接跳到下一步. [root@local~]#yum install wget 第二步:备份你的原镜像文件,避免 ...

  5. MA82G5D16AS16 主频调试记录

    MA82G5D16AS16 主频调试记录 当 SCKS 设置 为 MCKDO / 128 时 MCU 的电流为 0.58mA,100UF 电容可以维持 0.5S,大概可以满足. 但是需要注意外围的线路 ...

  6. Mezzanine汉化

    1.编辑/path/to/projectname/projectname下的setting.pyALLOWED_HOSTS = ['www.xxx.com'] 为了使用域名来访问TIME_ZONE = ...

  7. 四、ABP 学习系列 - 配置Swagger

    一.再XX.Web项目中用Nuget安装Swashbuckle.AspNetCore.SwaggerGen和Swashbuckle.AspNetCore.SwaggerUI 二.在Startup.cs ...

  8. java代码分解质因数

    总结: 循环...首位 逻辑要清晰 很简单.首先质因数最小的2.因为1不是质数 然后当输入的数刚好为2时,结束.不用下一步了.否则在循环里不停的输出一个数, 当输入的数比2大时,分能被2整除和不能被2 ...

  9. Spring Boot整合Rabbitmq

    Spring Boot应用中整合RabbitMQ,并实现一个简单的发送.接收消息的例子来对RabbitMQ有一个直观的感受和理解. 在Spring Boot中整合RabbitMQ是一件非常容易的事,因 ...

  10. Angular常犯的错误

    ng-app="name名称" name名称  == 一定要写对 其次 angular.min导入一定要正确,一定要导入正确的angular.min的库 再次js中要写自调用 (f ...