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允许使用作用域运算符(::)来获取类中成员的大小,以前只允许先创建一个类的对象,通过类对象访问成员得 ...
随机推荐
- C语言第一节 C语言程序与开发工具
开发工具的选择 可以用来写代码的工具:记事本.UltraEdit.Vim.Xcode等 选择Xcode的原因:苹果官方提供的开发利器.简化开发过程.有高亮显示功能 使用Xcode新建一个C程序的源代码 ...
- Pretty Poem
Poetry is a form of literature that uses aesthetic and rhythmic qualities of language. There are man ...
- c#导出Excel 使用EXCEL进程
private void exportExcel(string filename, string path,string title, List<ArchivedWcsTask> wcst ...
- sql 自定义函数--十进制转二进制
随笔记忆: if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[DECTOBIN]') and xtype in ...
- InvocationTargetException
在使用反射的适合,调用的方法无论抛出什么异常,都会变成InvocationTargetException,要想得到原始的异常,必须使用getTargetException()
- oracle 10g升级到11g
Linux 上Oracle RAC 10g 升级到 Oracle RAC 11g 了解如何在 Oracle Enterprise Linux 5 上逐步将 Oracle RAC 10g 第 2 版升级 ...
- Dubbo服务调用的动态代理和负载均衡
Dubbo服务调用的动态代理及负载均衡源码解析请参见:http://manzhizhen.iteye.com/blog/2314514
- 在Visual Studio 的 “一般处理程序 ” .ashx 文件中如何创建Session 对象
只需要继承这个接口即可实现创建Session对象. IHttpHandler,System.Web.SessionState.IHttpSessionState 代码示例: public class ...
- 203. Segment Tree Modify
最后更新 二刷 08-Jan-2017 利用线段树来更改,找到更改的NODE,然后更改那个brach上的所有max值. 首先确定recursion的终止条件 然后通过判断大小来找方向 找到NODE之后 ...
- css水平居中总结
前言 看了好多篇帖子,发现没有一个能够直接让新手很快上手使用水平居中布局的,所以在此进行一番总结,也算是我对水平居中布局的一点点积累沉淀,同时也方便初学者们拿来即用. 一.元素分类 1.行内元素 行内 ...