一、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. codevs 2503 失恋28天-缝补礼物

    题目描述 Description 话说上回他给女孩送了n件礼物,由于是廉价的所以全部都坏掉了,女孩很在意这些礼物,所以决定自己缝补,但是人生苦短啊,女孩时间有限,她总共有m分钟能去缝补礼物.由于损坏程 ...

  2. jsp中引入JavaScript的方法

    1:在页面中直接嵌入JavaScript <script language="javascript">..........</script> 2:链接外部J ...

  3. centos7 showdoc 安装部署

    1.进入showdoc官网帮助目录下 https://www.showdoc.cc/web/#/help?page_id=828455960655160 阅读自动安装部署相关事项: 2.利用xshel ...

  4. 月薪3万Java程序员要达到的技术层次

    要达到月薪3万,一般要在北上广深杭知名的互联网公司,同时要在某一个知识领域达到专家级别,而不是简单的掌握SSH那么简单.虽然对部分人有点难,但目标还是要有的,万一实现呢? 首先三万的月薪在BAT实在太 ...

  5. Python time和datatime模块

    time和datatime模块 时间相关的操作,时间有三种表示方式: 时间戳               1970年1月1日之后的秒,即:time.time() 格式化的字符串    2014-11- ...

  6. bootstrap简单的签收页面

    http://aqvatarius.com/themes/atlant/html/ui-icons.html <%@ Page Language="C#" AutoEvent ...

  7. extern关键字祥解

    1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.此外extern也可用来进行链接指定. 也就是说extern ...

  8. java代码String创建对象数组,进行排序

    总结:String是一个类.对于字串大小比较用方法:compareTo() package com.da.ima2; public class gh { public static void main ...

  9. 【转】前端上传组件Plupload使用指南

    http://www.cnblogs.com/2050/p/3913184.html Plupload有以下功能和特点: 1.拥有多种上传方式:HTML5.flash.silverlight以及传统的 ...

  10. 如何深度优化MySQL内核

    MYSQL数据库适用场景广泛,相较于Oracle.DB2性价比更高,Web网站.日志系统.数据仓库等场景都有MYSQL用武之地,但是也存在对于事务性支持不太好(MySQL 5.5版本开始默认引擎才是I ...