sizeof的用法的一些归纳
1 sizeof 是运算符,不是函数
2 sizeof 不能求得void
类型的长度,能求得 void*
类型的指针的长度
sizeof(void) 会导致编译错误。因为声明一个变量的最重要的作用就是告诉编译器该变量需要多少的存储空间,然而void是空类型,编译器无法确定void类型所需要的存储空间。
声明void*
在32位的机子上面是 4 字节的空间, 在64位的机子上面是 8 字节的空间。
3 sizeof 对结构体的大小的求解并不等于各个数据成员的大小的和
struct A{
int a;
int b;
double c;
};
struct B{
int a;
double b;
int c;
};
sizeof(A) //16
sizeof(B) //24
- 1 结构体的大小等于结构体内最大成员的大小的整数倍
- 2 结构体内的成员的首地址相对于结构体首地址的偏移量是其类型大小的整数倍,比如说
double
型成员相对于结构体的首地址的地址偏移量应该是8的整数倍 - 3 为了满足上面两条的规则,编译器会在结构体成员之后进行字节填充
再来看sizeof(B)
,第一个成员a
的首地址是0,他的类型是int
,因此他的占用地址是0--3,第二个成员是double
,他占用8个字节,由于之前a之占用了4个字节,为了满足规则2,是的b的起始地址偏移量是8,占用的地址空间是8--15,第三个数据成员是
int
类型,占用4个字节,由于a和b共占用16个字节,而c占用16--19字节,那是不是结构体的大小就是20个字节呢,
错误,规则1的有沿途结构体内的最大数据成员是
double
类型,因此还要在c的后面填充4个字节,是的结构体的大小是24个
4 sizeof 可以对函数调用求大小,记住求得大小是返回类型的大小,而且不执行函数体
int fun(int &a, int &b)
{
float c = 2.0;
double d = 0.5;
a = a+b;
return d;
}
int a =3;
int b =5;
cout << sizeof(fun(a,b))<<endl; //4
cout << a <<endl; //3
fun()的返回类型是int
类型的,许多人认为返回是 double
型的 ret, 但是进行了不安全的类型转换 double ---> int
a 的值,sizeof根本就不执行函数体
sizeof的用法的一些归纳的更多相关文章
- C#中sizeof的用法实例分析
这篇文章主要介绍了C#中sizeof的用法,包括了常见的用法及注释事项,需要的朋友可以参考下. sizeof是C#中非常重要的方法,本文就以实例形式分析C#中sizeof的用法.分享给大家供大家参 ...
- c++之sizeof的用法
在此温习一下c语言中sizeof的用法以及c++11.0的标准中,关于初始化的新方式,先上代码: # include "iostream" # include "stri ...
- C语言中sizeof()的用法
语法 sizeof有三种语法形式: 1.sizeof(object); //sizeof(对象); 2.sizeof(type_name); //sizeof(类型); 3.sizeof object ...
- sizeof的用法
因为对sizeof不是很了解,所以去查了博客啥的,发现还是有大学问的,以下对其用法进行总结. 参考:https://www.cnblogs.com/zhangyz/articles/4736758.h ...
- C语言中sizeof的用法
今天同学问我sizeof可不可以计算结构体的大小,我竟然忘了C语言还有sizeof这个函数,我是多久没有写程序了啊!!!惭愧,上研究生后写嵌入式方面的程序就特别少了,看来以后还要经常来练练手才行.现在 ...
- sizeof的用法 2007-12-19 11:06
sizeof的作用是什么?sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数.其返回值类型为size_t,在头文件stddef.h中定义 ...
- 全面总结sizeof的用法(定义、语法、指针变量、数组、结构体、类、联合体、位域位段)
一.前言 编译环境是vs2010(32位). <span style="font-size:18px;">#include<iostream> #inclu ...
- c++中sizeof的用法
/*测试sizeof() 测试环境:windows 7 64位操作系统 VS2012编译器 */ #include <iostream> using namespace std; int ...
- sizeof新用法(c++11)
1.概念 1)sizeof是关键字,也是运算符,用来求对象占用空间的大小,返回字节数 2)c++11允许使用作用域运算符(::)来获取类中成员的大小,以前只允许先创建一个类的对象,通过类对象访问成员得 ...
随机推荐
- python(3)-lambda表达式
>>> fun = lambda a: a+1 >>> fun(1) 2 >>> fun = lambda a,b: a+b >>&g ...
- oracle定期运行job
数据库:oracle 11g,操作都在pl/sql客户端完成 第一步.创建一个”E_P_FFM_STATE(fltdt in varchar2)“存储过程 第二步.打开Command Window,创 ...
- pycharm中文乱码的问题
这几天一直挺困扰的是使用pycharm之后一直对中文的乱码,即使添加了很多别人说的类似于#coding:utf-8的语句但是还是报错,让我抓狂,但是今天终于找到了解决的办法,还真的是让人很高兴啊,哈哈 ...
- 学习28个HTML5特征、窍门和技术
当下,H5火热得不行,写下这篇文章,认真的认识下HTML5. HTML5最早应该是09年左右被提出,然而当时受浏览器兼容性的影响,一直没得到普遍应用,最近也是因为移动端的发展,带动HTML5. 回归正 ...
- Bootstrap之Footer页尾布局(2015年05月28日)
直接上页尾部分的代码: <!--采用container-fluid,使得整个页尾的宽度为100%,并设置它的背景色--><footer class="container-f ...
- Java Concurrency - 线程执行器
Usually, when you develop a simple, concurrent-programming application in Java, you create some Runn ...
- CXF(2.7.10) - RESTful Services
1. 定义 JavaBean.注意 @XmlRootElement 注解,作用是将 JavaBean 映射成 XML 元素. package com.huey.demo.bean; import ja ...
- 三种方式得到LayoutInflater
LayoutInflaterinflater=LayoutInflater.from(this); LayoutInflaterinflater=getLayoutInflater(); Layout ...
- Annotation注解与butterknife
注解分为三种,一般来讲我们使用的是运行时会加载及能够反射读取的注解类型, 其他编译器生效的类型和编译后放入类文件而运行期不能加载解析的对我们没啥用. 所以从普通理解上来看,注解要配合着反射用就好了. ...
- JAVA-位运算符
请解释&和&&.|和||的区别? 在逻辑运算中: · 与操作:与操作分为两种,一种是普通与,另外一种是短路与: |- 普通与(&):表示所有的判断条件都要执行,不管前面 ...