一、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. swing之borderlayout

    import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JFrame; //1.继承 JFrame类 ...

  2. [转]【技术心得】Last-Modified,Etag,Expire区别

    Last-Modified 是什么 Last-Modified 是 HttpHeader 中的资源的最后修改时间,如果带有 Last-Modified ,下一次发送 Http 请求时,将会发生带 If ...

  3. BZOJ1999 树网的核[数据加强版]

    1999: [Noip2007]Core树网的核 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1214  Solved: 336[Submit][St ...

  4. Azure CLI脚本查看未挂载的ManagedDisk

    本文介绍如何用Azure CLI的脚本查看未挂载的Managed Disk,以及Managed Disk挂载到哪些资源. 具体的脚本如下: #!/bin/bash rm -rf noownerdisk ...

  5. [转] pip镜像升级报警 -trust-host问题解决方案

    pip升级到7.0以后,在使用http镜像进行包安装及升级的时候往往会有如下提示: Collecting beautifulsoup4The repository located at mirrors ...

  6. L2-013. 红色警报(dfs)

    L2-013. 红色警报 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 战争中保持各个城市间的连通性非常重要.本题要求你编写一 ...

  7. 查看,创建,删除,映射rbd镜像

    标签(空格分隔): ceph,ceph实验,pg 1. 创建镜像: [root@node3 ~]# rbd create testpool/foo --size 1024 2. 查看镜像信息: [ro ...

  8. kvm iptables 3306端口

    # iptables -t nat -A PREROUTING -p TCP --dport 3306 -j DNAT --to-destination 192.168.122.102:3306# i ...

  9. FFmpeg for Android compiled with x264, libass, fontconfig, freetype and fribidi

    android下打算使用ffmpeg的 drawtext ,不过需要 --enable-libfreetype  但是freetype是个第三方库,所以需要先编译freetype,然后再编译ffmpe ...

  10. TCP/IP 笔记 1.3 IP:网际协议

    ---恢复内容开始--- I P是T C P / I P协议族中最为核心的协议.所有的 T C P.U D P.I C M P及I G M P数据都以I P数据报格式传输. 不可靠( u n r e ...