您的位置:首页 > 编程语言 > C语言/C++

通过程序解读sizeof

2015-03-29 16:45 134 查看
<pre name="code" class="cpp">#include <iostream>
#include <string>

using namespace std;

void foo3(char *c1)
{
int c3 = sizeof( c1 ); // c3 ==
cout<< c3 << endl;
}
void foo4(int *c2)
{
int c4 = sizeof( c2 ); // c4 ==
cout<< c4 << endl;
}

//字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:
//1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
//2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;
//3) 结构体的总大小为结构体最宽基本(内置)类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节.
struct student
{
int num; // 占4个字节
char name[20]; // 占20个字节
char sex; // 占4个字节(结构体为每个成员分配空间时,根据最宽基本类型成员大小的整数倍进行分配,这里指的是int/float)
double age; // 占4字节
float score; // 占4字节
char addr[30]; // 占32字节(分配的空间必须为最宽基本类型成员大小的整数倍)
};

struct S1
{
char a; // 4字节
int i; // 4字节
};

// 嵌套的结构体
struct S2
{
char a; // 4字节
int i; // 4字节
student t; // 占68字节,最宽基本类型成员为int/float型,4字节(注意,这里最大成员不是t,因为它不属于内置类型;具体计算S2时,student要按S2中的最近倍数来算)
};

// 空结构体
struct S3{};

// 共用体成员共用一个空间,所以其为最宽基本类型成员的大小
union U
{
int i;
char a;
};

int main()
{
/* 1.
int count=0; int m=779;
while(m)
{
count++; m=m&(m-1);
}
//printf("%d\n",count);
cout<< count << endl;
return 0;
*/

// sizeof的用法
//(1)数组1
int p1[10];
int *p2[10];
int (*p3)[10];

cout<< "int p1[10]       sizeof(p1):" << sizeof(p1) << endl;
cout<< "int *p2[10]      sizeof(p2):" << sizeof(p2) << endl;
cout<< "int (*p3)[10]    sizeof(p3):" << sizeof(p3) << endl;
cout<< "----------------------------"<< endl;

//(2)内置类型
char a1;
int a2;
float a3;
double a4;
long a5;
long double a6;
string a7;
string a8="abc"; // string类型变量本质上属于指针

cout<< "char:            " << sizeof(a1) << endl;
cout<< "int:             " << sizeof(a2) << endl;
cout<< "float:           " << sizeof(a3) << endl;
cout<< "double:          " << sizeof(a4) << endl;
cout<< "long:            " << sizeof(a5) << endl;
cout<< "long double:     " << sizeof(a6) << endl;
cout<< "string:          " << sizeof(a7) << endl;
cout<< "string a8=\"abc\": " << sizeof(a8) << endl;
cout<< "----------------------------"<< endl;

//(3)指针:所有的指针(包括结构体)均占4字节(一个int型大小)。
char *b1;
int *b2;
float *b3;
double *b4;
long *b5;
long double *b6;

cout<< "char*:       " << sizeof(b1) << endl;
cout<< "int*:        " << sizeof(b2) << endl;
cout<< "float*:      " << sizeof(b3) << endl;
cout<< "double*:     " << sizeof(b4) << endl;
cout<< "long*:       " << sizeof(b5) << endl;
cout<< "long double*:" << sizeof(b6) << endl;
cout<< "----------------------------"<< endl;

//(4)数组2
char c1[]="abcd";
int c2[4];

cout<< "char c1[]=\"abcd\":  " << sizeof(c1) << endl;
cout<< "int c2[4]:        " << sizeof(c2) << endl;

//数组名做形参:本质就是指针
cout<< "foo3(char *c1):   ";
foo3(c1);
cout<< "foo3(int *c2):    ";
foo4(c2);
cout<< "----------------------------"<< endl;

// (5)结构体
S1 s1;
S1 *s2;
S2 s3;
S3 s4;
student student1;
student *student2;

cout<< "S1 s1:             " << sizeof(s1) << endl;
cout<< "S1 *s2:            " << sizeof(s2) << endl;
cout<< "student student1:  " << sizeof(student1) << endl;
cout<< "student *student2: " << sizeof(student2) << endl;
cout<< "S2 s3:             " << sizeof(s3) << endl;
cout<< "S3 s4:             " << sizeof(s4) << endl;
cout<< "----------------------------"<< endl;

// 共用体
U u;
cout<< "U u:               " << sizeof(u) << endl;

system("pause");

return 0;
}
<div id="art_demo">本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节</div><p>在C语言中我们操作字符串肯定用到的是指针或者数组,这样相对来说对字符串的处理还是比较麻烦的,好在C++中提供了 string 类型的支持,让我们在处理字符串时方便了许多。</p><p><strong><span style="COLOR: #ff0000">首先,我写了一段测试代码,如下所示:</span></strong></p><pre name="code" class="cpp">#include <iostream>using namespace std;int main(void){string str_test1;string str_test2 = "Hello World";int value1, value2, value3;value1 = sizeof(str_test1);value2 = sizeof(str_test2);value3 = sizeof(string);cout<<"str_test1占 "<<value1<<" 个字节"<<endl;cout<<"str_test2占 "<<value2<<" 个字节"<<endl;cout<<"string占 "<<value3<<" 个字节"<<endl;system("pause");return 0;}
首先,我用G++编译运行,得到的结果如下图所示:
结果都是4字节;<p>这说明string占4个字节。之后,我用VS2012编译运行,得到的结果如下图所示:结果都是28字节。</p><p>奇怪,这里string竟然占28个字节。这里,我们注意观察,还会发现一个问题,不管有没有对string类型的变量赋值,或者是赋什么值,得到的结果是一样的。</p><p><strong>下面,来解释上述问题:</strong>string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长的字符串,它的sizeof()都是固定的,字符串所占的空间是从堆中动态分配的,与sizeof()无关。    sizeof(string)=4可能是最典型的实现之一,不过也有sizeof()为12、32字节的库实现。通常,我们所用到的 string 类型一般都会是这样实现:</p><p><pre name="code" class="cpp">class{char *_Ptr;    //指向字符串的指针int _Len;      //字符串的长度........};
所以,我们一般接触到的string类型所占字节数为 8+。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++
相关文章推荐