sizeof 的陷阱

来源:互联网 发布:doodle jump java 编辑:程序博客网 时间:2024/05/17 21:59

原文: http://blog.163.com/xiangzaihui@126/blog/static/1669557492011825111853370/


一直都认为C++学的可以,现在才发现被鄙视了,一些非常基础的知识搞不清楚。

sizeof一些小解。

一:

#include <iostream>

using namespace std ;

class A

{

public :

int a ;

static int b ;

A() ;

~A() ;

};   //sizeof  =  4   很简单。

class B

{

public :

int a ;

char b ;

B() ;

~B() ;

};   //sizeof   =  8  内存对齐,数据对齐

class C

{

public :

float a ;

char b ;

C() ;

~C() ;

};  //sizeof   =  8  内存对齐,数据对齐

class D

{

public :

float a ;

int b ;

char c ;

D() ;

~D() ;

};   //sizeof   =  12  内存对齐,数据对齐

class E

{

public :

double a ;

float b ;

int c ;

char d ;

E() ;

~E() ;

};  /* 关键是这个,我一直都以为会是20,结果才发现如果没有#pragma pack 的话对齐系数是由内中最大的数据成员的大小决定的,也就是对齐系数double决定。sizeof  =  24 因为 char d 的时候是17,而数据,内存对齐后需要转换成24  如果不懂得可以看看我的前面一篇文章

内存对齐 数据对齐解析*/

int main()

{

cout << sizeof( A ) << endl ;

cout << sizeof( B ) << endl ;

cout << sizeof( C ) << endl ;

cout << sizeof( D ) << endl ;

cout << sizeof( E ) << endl ;

return 0 ;

}

二:

#include <iostream>

using namespace std ;

void fun( char ch[] )

{

cout << sizeof( ch ) << endl ;

}

int main()

{

char ch[] = "adsasd" ;

fun( ch ) ;

return 0 ;

}

先了解下面这个事:

void fun( char ch[] )

Void fun( char* ch )

Void fun( char ch[10] )

上面三条语句都是相等的,上面的ch都会转换指针,在fun函数中ch是指针而不是数组的第一个元素的地址

因此上面三条语句,无论那条cout << sizeof( ch ) << endl ; 都会得到  4  , Int(指针) 的大小。

0 0
原创粉丝点击