sizeof()使用技巧

描述

sizeof()是C语言的一种单目运算符,它并不是函数。

1 作用:

以字节形式给出sizeof操作数的存储大小。操作数可以是一个表达式、基础类型、结构体、类类型等。

2 特点:

sizeof 是一个单目运算符,用于计算操作数的存储大小,在编译阶段就已经求值。

看如下代码

    int a = 0;

    int nSize1 = sizeof(a = 3);

    cout << nSize1 << endl;

    cout << a << endl;

若不清楚其中的原理,很多人会以为程序输出4和3,其实不然,正确答案是4 和 0.下面分析其原因。

图1 机器码

从图1可以看出,sizeof作用于编译阶段特性,在sizeof作用范围内,()内的内容也不能被编译,而是并替换成类型,直接给出操作数大小,这里是int类型,即4个字节。

其等价代码如下:

int a = 4;
int nSize1 = 4;
cout << nSize1 << endl;
cout << a << endl;

sizeof应用技巧

1)用于数据类型

格式:sizeof(type) 数据类型必须要用括号括住,如下示例:

int n = sizeof(int);

2)用于普通数据类型的变量

格式:sizeof(var_name) 或者sizeof var_name, 如下示例:

int a ;
cout << sizeof(a)<< endl;
cout << sizeof a <<endl;

备注: 带括号的更常用

3)用于指针

当操作数是指针时,sizeof依赖于编译器, 32位操作系统都是占4个字节,如下示例:

<pre name="code" class="cpp">    class A
    {
    public:
        A():m_a(0),m_b(0),m_c(0){}
        A(int a, int b, int c):m_a(a),m_b(b),m_c(c){}
        void output()
        {
            cout << m_a << m_b << m_c <<endl;
        }
    private:
        int m_a;
        int m_b;
        int m_c;
    };
    A *pA = new A(1,2,3);
    char szName[20] = "hello world";
    char * ptr = szName;

    cout << sizeof(pA) << endl;     //4字节
    cout << sizeof(ptr)<< endl;     //4字节
    cout << sizeof(szName) <<endl;  //20字节

4)用于数组

当操作数具有数组类型是,其结果是数组的总字节数,如下示例:

    char szName[20] = "hello world";
    char * ptr = szName;

    cout << sizeof(ptr)<< endl;     //4字节
    cout << sizeof(szName) <<endl;  //20字节,数组名代表整个数组

因此用于初始化数组空间时建议使用sizeof(type) * num.这么做是基于代码更加健壮性的考虑,例如:

     memset(szName, 0, sizeof(char)*20) //健壮性好
    memset(szName, 0, sizeof(szName)) //当szName变量被改成new方式时,sizeof(szName)为4字节

5)用于结构体

在默认情况下,为了方便对结构体内的元素进行访问和管理,结构体类型需要符合4字节对齐。

struct tagEx1
    {
        unsigned nAge;
    };
    struct tagEx2
    {
        unsigned nAge;
        char ch;
    };
    struct tagEx3
    {
        char ch;
    };
    cout << "tagEx1: " << sizeof(tagEx1) << endl;//4个字节
    cout << "tagEx2: " << sizeof(tagEx2) << endl;//8个字节,4字节对齐
    cout << "tagEx3: " << sizeof(tagEx3) << endl;//1个字节

6)用于类

sizeof用于类的用法和用于结构体的是一致的。另外,对类类型我们还可以使用cl命令完成类类型内存大小的查看,具体用法见博文C++对象内存模型分析工具 。

时间: 2024-07-30 20:28:59

sizeof()使用技巧的相关文章

HDU 4509 湫湫系列故事——减肥记II(线段树-区间覆盖 或者 暴力技巧)

http://acm.hdu.edu.cn/showproblem.php?pid=4509 题目大意: 中文意义,应该能懂. 解题思路: 因为题目给的时间是一天24小时,而且还有分钟.为了解题方便,我们将小时换成分钟,那么一天24小时,总共有1440分钟.顾我就可以把一天里的任意HH:MM时间换成分钟.就这样一天的时间就变成[0,1440]区间了. 因为所给的活动最多是5*10^5,如果把活动的时间在线段[0,1440]都修改,那么时间的复杂度最坏是O(5*10^5*1440). (1)方法一

C++面试题5:建议在函数里面不要用sizeof算数组的大小

C++面试题5:建议在函数里面不要用sizeof算数组的大小 #include <iostream>using namespace::std; void foo(const int[]); int main() { int arr[3] = {1,2,3}; cout<<"in main array size: "<<sizeof(arr)/sizeof(int)<<endl; foo(arr); } void foo(const int

0x3f3f3f3f...编程中无穷大常量的设置技巧

转自 http://aikilis.tk/ 如果问题中各数据的范围明确,那么无穷大的设定不是问题,在不明确的情况下,很多程序员都取0x7fffffff作为无穷大,因为这是32-bit int的最大值.如果这个无穷大只用于一般的比较(比如求最小值时min变量的初值),那么0x7fffffff确实是一个完美的选择,但是在更多的情况下,0x7fffffff并不是一个好的选择. 很多时候我们并不只是单纯拿无穷大来作比较,而是会运算后再做比较,例如在大部分最短路径算法中都会使用的松弛操作:if (d[u]

『干货』分享你最喜欢的技巧和提示(Xcode,objective-c,swift,c...等等)

亲爱的读者们,你们好 !年底将近,分享从过去一年你最喜欢的技巧和建议作为礼物送给新手们.提交你的最喜欢的迅速或objc琐事,实用的提示,意外的发现,实用的解决方法,没用的迷恋,或不论什么其它你认为今年非常酷. 就在以下写下你的评论! 笔者分享总结例如以下(本篇会不定期进行更新) : objective-c 用宏定义检測block是否可用~! #define BLOCK_EXEC(block, ...) if (block) { block(__VA_ARGS__); }; // 宏定义之前的使用

[黑科技]常数优化的一些技巧

感谢wys和小火车普及这些技巧qwq 这篇文章大概没什么营养 我们来看一道十分简单的题目: 设n=131072,输入两个长度为n的数列和,要求输出一个长度为n的数列. 其中,. 首先我们来讲讲这题怎么做. 如果数据是随机的,那么有一种神奇的做法:在a和b中分别挑出最大的p个元素,对于每个i暴力枚举每个p进行更新,这样的复杂度是O(np)的,正确性我不会分析= = 那么数据不是随机的...那么估计没有什么快速的算法,不如暴力! 以下的运行时间均为在我的渣渣笔记本中测试得到,仅供参考.测试环境Ubu

c++编程思想(三)--c++中c 续,重点sizeof和内存对齐

之前理论性的太多,下面就是代码及理论结合了 1.sizeof()是一个独立运算符,并不是函数,可以让我们知道任何变量字节数,可以顺带学一下struct,union,内存对齐 内存对齐:为了机器指令快速指向地址值,编译器内部实际上会内存对齐,怎么理解了,以struct为例 先讲一下各个变量类型内存大小 所以struct理论上是:1+2+4+4+4+8+8 = 31,但是实际是 实际大小是32(1+2+1+4)+(4+4)+8+8 然后再把int和short位置调换 实际大小是40   (1+3)+

Day4:T1小技巧(类似于指针操作)T2搜索+小细节

Day4:其中有很多小技巧get T1 一直没有听到过像这样的小技巧的略专业名词,有点类似于指针操作,之前有碰到过很多这样的题目 每次都是以不同的形式出现,但是感觉思想还是有点接近的吧(就比如某天有一题happy,貌似也是这类型的) 这类题目第一眼总是看起来特别的不能写,其实想到了这些技巧之后很简单 感觉这也没有什么规律性或是模板可言 大概的,就是指针思想+平时积累吧 说说这一题吧 在分析正解之前,我们先说一说比较容易想到的骗分方法 设男女人数相同时ans=0,如果下一个是男->ans++,el

ZStack中的编程技巧

1. 像函数一样使用的宏 //这个宏,用来被其他宏使用,构造一个正确有效的表达式.这个适合于一些离散语句的组合,不适合函数的重新命名 #define st(x)      do { x } while (__LINE__ == -1) 例如:#define aps_GroupsRemaingCapacity() ( APS_MAX_GROUPS - aps_CountAllGroups() ) 上述的这个宏,调用的其他函数来实现其功能,因此,不适合使用st()宏. 使用场景:  aps_Grou

poj 1699 Best Sequence (搜索技巧 剪枝 dfs)

题目链接 题意:给出几个基因片段,要求你将它们排列成一个最短的序列,序列中使用了所有的基因片段,而且不能翻转基因. 分析:先计算出add数组,再dfs枚举. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cmath> 5 #include <cstdio> 6 #include <vector> 7 #include <al