宁波网站关键词推广,wordpress标签小工具栏,wordpress值得买模板,越秀网站建设推广sizeof小览 一、文章来由—一道面试题迁出的探究 我发现我已经形成一种习惯写来由了#xff0c;以后看博客的时候能够让我回顾起为什么出现这个问题#xff0c;我用什么方法解决的#xff0c;既然形成习惯就让这个习惯保持下去吧。今天实验室师姐在看书#xff0c;一处不解… sizeof小览 一、文章来由—一道面试题迁出的探究 我发现我已经形成一种习惯写来由了以后看博客的时候能够让我回顾起为什么出现这个问题我用什么方法解决的既然形成习惯就让这个习惯保持下去吧。今天实验室师姐在看书一处不解。是关于sizeof的大家讨论此问题后我一向信服做了才知道答案于是有了这篇文章。可是仅仅能叫小览由于不可能总结完sizeof的使用方法欢迎补充和讨论。 二、从这道题目说起 我直接将问题的关键部分提出来 string strArr1[] { Trend, Micro, Soft };
cout sizeof(strArr1) sizeof(strArr1) endl; 请问输出多少。书上的答案这样写道 而字符串strArr1是由3段构成的所 以sizeof(strArr1)大小是12。 首先要明白sizeof不是函数也不是一元运算符它是个相似宏定义的特殊关键字特别是sizeof(string)4。 这个不去试是不知道的。由于编译器那么多。编译器做什么事情不去试怎么可能知道 果然在vs2013 release Win32模式x64模式还要更大下结果是 sizeof(string) 24 sizeof(strArr1) 72 debug模式 sizeof(string) 28 sizeof(strArr1) 84 也是3倍关系由于这是一个string数组。里面有三个string对象 那么为什么string有不同的结果 查阅了相关资料得出结论我们知道char*肯定是4字节string里面可能不止包括一个char*那么简单还包括有长度信息等其它信息。string的实如今各库中可能有所不同可是在同一库中同样一点是不管你的string里放多长的字符串它的sizeof()都是固定的。字符串所占的空间是从堆中动态分配的与sizeof()无关。 sizeof(string)4可能是最典型的实现之中的一个只是也有sizeof()为12、32字节的库实现。 可是VC6.0測试后sizeof(string)16.还是跟编译器有关为了全然測试一些东西。我測试越写越多然后我来了威力加强版。见代码 #includeiostreamusing namespace std;int main()
{char p[] { a, b, c, a, b, c };char *p1 abcabc;char p2[] abcabc;char p3[][2] { { a, b }, { c, a }, { b, c } };printf(p %s\n, p);cout p endl;cout sizeof(p) sizeof(p) endl;cout sizeof(p1) sizeof(p1) endl;cout sizeof(p2) sizeof(p2) endl;cout sizeof(p3) sizeof(p3) endl;coutsizeof(string) sizeof(string) endl;string strArr1[] { Trend, Micro, Soft };cout sizeof(strArr1) sizeof(strArr1) endl;int a 0;cout sizeof(a 3) sizeof(a 3) endl;cout a a endl;cout sizeof(999999) sizeof(999999) endl;cout sizeof(9999999999999999999) sizeof(9999999999999999999) endl;cout sizeof(9 / 5) sizeof(9 / 5) endl;cout sizeof((double)9 / 5) sizeof((double)9 / 5) endl;return 0;
} 执行结果如图所看到的 我来一一解释我的这些測试在做什么 1首先p的这种初始化方式。在末尾不会加’\0’。所以 sizeof(p) 6并且一个有趣的问题是printf和cout直接输出p是不同的printf是要碰到’\0’结束我也看了printf和cout的汇编代码可是没有细究之后又空具体研究一下 2p1和p2的sizeof不同。由于一个是指针一个是字符数组。指针在Win32编译环境下的sizeof都是4。由于是4字节的地址。32bits可寻址空间 3p3是还有一个有趣的问题p3不能写成p3[3][]来初始化由于这样初始化要保证二维数组每一行的个数同样。也就是不能出现“參差不齐”的情况那种情况要动态分配 4这是一个陷阱 int a 0;
coutsizeof(a3)endl;
coutaendl; 输出为什么是4。0 而不是期望中的4。3就在于sizeof在编译阶段处理的特性。由于sizeof不能被编译成机器码。所以sizeof作用范围内也就是()里面的内容不能被编译而是被替换成类型。操作符返回左操作数的类型。所以a3相当于int而代码也被替换为 cout4endl;
coutaendl; 所以sizeof是不可能支持链式表达式的。这也是和一元操作符不一样的地方。 不要把sizeof当成函数也不要看作一元操作符把他当成一个特殊的编译预处理。 5这种原因是999999是一个编译器int型能够搞定的数。所以按int来处理太大的数不能用int搞定可是8个字节一定能够搞定的 sizeof(999999) 4 sizeof(9999999999999999999) 8 6最后是看了9 / 5编译器是作为int看待的。强制转换后才是double 三、sizeof 能总结多少是多少 sizeof博大精深。即使看了非常多资料一口气总结完也是不可能了总结经常使用的就好。 1、什么是sizeof 首先看一下sizeof在msdn上的定义 The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t. 看到return这个字眼是不是想到了函数错了sizeof不是一个函数。你见过给一个函数传參数而不加括号的吗sizeof能够所以sizeof不是函数。网上有人说sizeof是一元操作符。可是我并不这么觉得由于sizeof更像一个特殊的宏它是在编译阶段求值的。举个样例 coutsizeof(int)endl; // 32位机上int长度为4
coutsizeof(12)endl; // 操作符返回bool类型。相当于 coutsizeof(bool)endl; 在编译阶段已经被翻译为cout4endl;
cout1endl; 2、语法 sizeof有三种语法形式。例如以下 1) sizeof( object ); // sizeof( 对象 ); 2) sizeof( type_name ); // sizeof( 类型 ); 3) sizeof object; // sizeof 对象; 所以 int i; sizeof( i ); // ok sizeof i; // ok sizeof( int ); // ok sizeof int; // error 既然写法1能够全然代替写法3为求形式统一以及降低我们大脑的负担第3种写法。忘掉它吧 实际上。sizeof计算对象的大小也是转换成对对象类型的计算。也就是说同种类型的不同对象其sizeof值都是一致的。这里对象能够进一步延伸至表达式即sizeof能够对一个表达式求值。编译器依据表达式的终于结果类型来确定大小一般不会对表达式进行计算。如 sizeof( 2 ); // 2的类型为int。所以等价于 sizeof( int ); sizeof( 2 3.14 ); // 3.14的类型为double2也会被提升成double类型。所以等价于 sizeof( double ); 3、函数的sizeof 函数类型 考虑以下的问题int f1(){return 0;};
double f2(){return 0.0;}
void f3(){}coutsizeof(f1())endl; // f1()返回值为int因此被觉得是int
coutsizeof(f2())endl; // f2()返回值为double因此被觉得是double
coutsizeof(f3())endl; // 错误。无法对void类型使用sizeof
coutsizeof(f1)endl; // 错误无法对函数指针使用sizeof
coutsizeof*f2endl; // *f2和f2()等价由于能够看作object所以括号不是必要的。被觉得是double 结论对函数使用sizeof在编译阶段会被函数返回值的类型代替 4、数组的sizeof char a[] abcdef;
int b[20] {3, 4};
char c[2][3] {aa, bb};coutsizeof(a)endl; // 7
coutsizeof(b)endl; // 20*480
coutsizeof(c)endl; // 6 数组a的大小在定义时未指定。编译时给它分配的空间是依照初始化的值确定的。也就是7。c是多维数组占用的空间大小是各维数的乘积也就是6。能够看出。数组的大小就是他在编译时被分配的空间。也就是各维数的乘积*数组元素的大小。 结论数组的大小是各维数的乘积*数组元素的大小。 这里有一个陷阱 int *d new int[10];coutsizeof(d)endl; // 4 d是我们常说的动态数组。可是他实质上还是一个指针所以sizeof(d)的值是4。 再考虑以下的问题 double* (*a)[3][6];
coutsizeof(a)endl; // 4
coutsizeof(*a)endl; // 72
coutsizeof(**a)endl; // 24
coutsizeof(***a)endl; // 4
coutsizeof(****a)endl; // 8 a是一个非常奇怪的定义他表示一个指向 double*[3][6]类型数组的指针。既然是指针所以sizeof(a)就是4。 既然a是指向double*[3][6]类型的指针*a就表示一个double*[3][6]的多维数组类型因此sizeof(*a)3*6*sizeof(double*)72。同样的**a表示一个double*[6]类型的数组所以sizeof(**a)6*sizeof(double*)24。***a就表示当中的一个元素也就是double*了所以sizeof(***a)4。至于****a就是一个double了所以sizeof(****a)sizeof(double)8。 差点儿相同也要结束了假设更进一步了解须要查阅很多其它的资料~~~ —END— 參考文献 [1] http://blog.csdn.net/freefalcon/article/details/54839 [2] http://www.cnblogs.com/wanghetao/archive/2012/04/04/2431760.html posted on 2017-07-07 14:21 mthoutai 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/mthoutai/p/7131998.html