`
yidongkaifa
  • 浏览: 4072600 次
文章分类
社区版块
存档分类
最新评论

C++中的sizeof操作符

 
阅读更多

1.1. sizeof操作符

sizeof操作符用于获得一个表达式的类型的大小,表达式可以是一个运算式、变量或类型,当sizeof后面是单个标识符时,不需要括号。如果sizeof表达式作为整个表达式的一部分时最好使用括号,除非你很清楚各运算符的优选级。sizeof的优先级是一元运算符中最低的,但高于所有二元运算符。使用sizeof获得C++内置类型的值可能为(不同CPU、不同编译器都可能不同):

数据类型

sizeof

备注

bool

1

一般都是1,尚未发现不为1的编译器

char

unsigned char

signed char

1

C++标准定义

short [int]

unsigned short [int]

shigned short [int]

2

C++标准规定至少为不比char小,绝大多数编译器都是2,尚未发现有编译器为其它值

int

unsigned int

signed int

1,2,4,8

不同CPU不同,8位单片机可能为1(可能会有编译器选项设为4);16位单片机为2(可能有编译器选项改为4);32位CPU一般为4,64位CPU多数编译器也默认为4,可能有编译选项设为8

long [int]

unsigned long [int]

signed long [int]

4, 8

C++标准规定至少为4,但绝大多数编译器也都是4,但有些编译器提供了编译选项,可以设为8

long long [int]

unsigned long long [int]

4, 8

一般为8,但在一些嵌入式设备的编译器中可能只支持到4个字节的精度

float

4

绝大多数编译器都实现为4个字节的精度

double

4,8

绝大多数编译器都实现为8个字节的精度,但有些嵌入式编译器可能只支持4个字节

long double

4, 8, 12

一般为12,但有些编译器特别是嵌入式编译器可能只支持8字节精度,甚至只支持4字节精度

void*, char*, short*, int* , boo*, long*, long long*, float*, double*, long double*

2,4,8

在8、16位单片机上为2,在32位机上为4,在64位机上为64

enum

4,8

一般为4,但有的编译器可以支持enum的值定义为long long型扩展到8字节(如VC++ 2010、gcc 4.3.4),有的编译器严格检查定义的值,超过4字节时则给出编译错误(如C++Builder 2010),C++标准并没有规定具体大小。

1.1.1. 提高程序的易维护性

合更地使用sizeof可以更好的提高软件的易维护性,例如下面的代码,当我们添加或删除数组中的元素时for循环里的循环条件无需修改。

char* arr[] = {"str1", "str2", "str3", "str4"};

for(int i=0; i<sizeof><p>cout </p> <p>} </p> <h5> <a>1.1.2. 代替strlen</a>检测字符串常量的长度</h5> <p>如果您在编译期就可以确定字符串常量的长度,请使用sizeof,不要使用strlen,如代码1-?所示。但这里只能用于求字符串常量的值,sizeof( )的表达式不能是char*类型,否则就成了指针的大小了,而不是指向的字符串。 </p> <p>// 代码1-7 </p> <p>#include <iostream></iostream></p> <p>#define static_strlen(str) (sizeof(str)-1) </p> <p>int main( void ) </p> <p>{ </p> <p>#define HELLO "Hello" </p> <p>std::size_t len = static_strlen("Hello") ; </p> <p>std::cout </p> <p>return 0; </p> <p>} </p> <h5>1.1.3. 数组</h5> <p>当sizeof操作符作用于数组上时,返回的时数组元素的个数乘以元素的大小,例如 </p> <p>char carr[5]; // sizeof(carr) = 5 </p> <p>short* sarr[10]; // sizeof(sarr) = 20 </p> <p>但是,当数组作为函数的参数时,其实是按指针传递的,在函数内使用sizeof作用于参数时,得到的是指针的值,如: </p> <p>void func( char arr[20], int len) </p> <p>{ </p> <p>cout </p> <p>} </p> <p>所以,在参数为数组时,一般都会有另外一个参数,传递数组中包含元素的个数,否则函数体内不知道传递的实参包含元素的个数。有时也可以通过特殊元素作为结束符,例如对于字符串数组,可以将第一个字符为’/0’的空字符串表示整个数组的结束。 </p> </sizeof>

分享到:
评论

相关推荐

    C++ sizeof 实例解析

    sizeof操作符以字节形式给出了其操作数的存储大小。sizeof使用形式有三种:sizeof(var_name)或sizeof var_name或sizeof(var_type)。【例1】:(列子中忽略构造及析构函数) 代码如下:class A { public: void ...

    C语言中的sizeof操作符用法及和strlen的区别

     sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。其返回值类型为size_t,在头文件stddef.h中定义。在32位系统中: char的sizeof值为1,char是我们编程能用的...

    详解C++ sizeof(上)

    sizeof是C/C++中的一个操作符(operator),其作用是返回一个对象或者类型所占的内存字节数,使用频繁,有必须对其有个全面的了解。 1.sizeof的基本语法 sizeof有三种语法形式。 (1)sizeof(object); //sizeof...

    C/C++中的sizeof运算符和size_t类型的详解

    sizeof是c的运算符之一,用于获取操作数被分配的内存空间,以字节单位表示. 这里指的操作数,可以是变量,也可以是数据类型,如int,float等.所以就可以通过它来获取本地c库定义的基本类型的范围。 sizeof的使用 1.对于...

    c++重载的详细总结

    1.操作符重载对大部分符号成立,一下几种不能重载:” . “, ” .* “, “ :: “, ” ?: “, ” sizeof “。 2.操作符重载分为 成员...如果操作符重载函数中需要访问形参类的私有成员,则需要把它说明成相应类的友元。

    C++ Primer第四版【中文高清扫描版】.pdf

    5.8 sizeof操作符 144 5.9 逗号操作符 145 5.10 复合表达式的求值 145 5.10.1 优先级 145 5.10.2 结合性 146 5.10.3 求值顺序 148 5.11 new和delete表达式 150 5.12 类型转换 154 5.12.1 何时发生隐式类型转换 154 ...

    c++运算符优先级

    优先级 操作符 描述 例子 结合性 1 () [] -&gt; . :: ++ -- 调节优先级的括号操作符 数组下标访问操作符 通过指向对象的指针访问成员的操作符 通过对象本身访问成员的操作符 作用域操作符 后置自增操作符 后置自减操作...

    非常经典的c++ primer视频教程6-10

    5.8 sizeof操作符 5.9 逗号操作符 5.10 复合表达式的求值 5.10.1 优先级 5.10.2 结合性 5.10.3 求值顺序 5.11 new和delete表达式 5.12 类型转换 5.12.1 何时发生隐式类型转换 5.12.2 算术转换 5.12.3 其他...

    C++ primer 第4版 原书+习题解答+源码 清晰pdf

     5.8 sizeof操作符  5.9 逗号操作符  5.10 复合表达式的求值  5.11 new和delete表达式  5.12 类型转换  小结  术语  第6章 语句  6.1 简单语句  6.2 声明语句  6.3 复合语句(块)  6.4 ...

    C++Primer中文版(第4版).part4

     5.8 sizeof操作符  5.9 逗号操作符  5.10 复合表达式的求值  5.11 new和delete表达式  5.12 类型转换  小结  术语  第6章 语句  6.1 简单语句  6.2 声明语句  6.3 复合语句(块)  6.4 ...

    后端,面试,c++ ,找工作

    (1)new、delete是操作符,可以重载,只能在C++中使用。 (2)malloc、free是函数,可以覆盖,C、C++中都可以使用。 (3)new可以调用对象的构造函数,对应的delete调用相应的析构函数。 (4)malloc仅仅分配...

    sizeof和strlen的区别

    sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如:void *malloc(sizex_t size), size_t fread(void * ptr, size_t size, size_t nmemb, FILE * stream)

    深入理解C++11:C++11新特性解析与应用

    252.4 宏__cplusplus 262.5 静态断言 272.5.1 断言:运行时与预处理时 272.5.2 静态断言与static_assert 282.6 noexcept修饰符与noexcept操作符 322.7 快速初始化成员变量 362.8 非静态成员的sizeof 392.9 扩展的...

    C语言中的操作符优先级的详细介绍

    C语言中操作符的优先级大全, 当然c++, Objective-C,大部分语言都试用。 下面是来自The C Programming Language 2th的总结。 OperatorsAssociativity(结合性) 1. () [] -&gt; . 左-&gt;右 2. ! ~ ++ -- + - *(type)...

    C++宏,预处理器,RTTI,typeid与强制类型转换专题.pdf

    属于学习C++的附加内容,本文主要讲解了sizeof 操作符,预处理器,#define,RTTI 与typid 的作用与使用方法, 对于需要了解这方面内容的读者可以参考之。

    C++学习资料打包下载

    #pragam.txt #pragma预处理指令的用法.pdf 常用ASCII编码.pdf VC++小游戏开发实例教程.chm sizeof.doc C++的忠告.doc C++初始化成员列表.doc c_c++中操作符的优先级.doc

    c++ 面试题 总结

    代码的位置必须在物理内存中才能被运行,由于现在的操作系统中有非常多的程序运行着,内存中不能够完全放下,所以引出了虚拟内存的概念。把哪些不常用的程序片断就放入虚拟内存,当需要用到它的时候在load入主存...

    java基础课件ppt

    java基础课件ppt与上机练习题....所有的数据类型所占用的字节数都是固定的,并且和实现无关,因此在Java中没有sizeof操作符。 不必死记这些关键词,当理解每个关键词的含义后,自然就记住了所有的关键词。

    浅析C语言中的sizeof

    sizeof是C/C++中的一个操作符(operator),作用就是返回一个对象或者类型所占的内存字节数。返回值类型为size_t,在头文件stddef.h中定义

    Visual C++ 2005入门经典.part08.rar (整理并添加所有书签)

    2.3.6 ISO/ANSI C++中的基本类型 2.3.7 字面值 2.3.8 定义数据类型的同义词 2.3.9 具有特定值集的变量 2.3.10 指定枚举常量的类型 2.4 基本的输入输出操作 2.4.1 从键盘输入 2.4.2 到命令行的输出 2.4.3 格式化输出 ...

Global site tag (gtag.js) - Google Analytics