20140321 sizeof 虚函数与虚函数表 静态数组空间 动态数组空间 位字段

时间:2021-08-21 05:38:04

1、静态的数组空间char a[10];sizeof 不能用于1:函数类型 2:动态的数组空间new3:位字段

函数类型:int fun();sizeof(fun())计算的是返回类型的大小,并不是函数大小,函数要在运行时才知道其大小,而sizeof是编译时操符号

    动态分配数组:sizeof()只是符号表,是编译的时候确定大小的。动态分配是运行过程中得到大小的,所以sizeof不能计算动态分配的数组大小。如:以下程序就动 态分配了数组a[N]。数组的长度N可输入确定,也可用程序中的变量确定。但要注意程序结束后要用free()将其释放,否则内存会泄漏。

#include<stdio.h>
#include<malloc.h>
void main()
{
int *a;
int N;
scanf("%d", &N);
a = (int *) malloc(N * sizeof(int));
printf("%d", sizeof(a));
free(a);
}

    输出结果为:4。4实际上就是指针的大小,并不是动态分配的数组a的大小

位字段:它主要用于一些使用空间很宝贵的程序设计中,如嵌入式程序设计。

看如下位字段的定义:

typedef struct bit_field {
unsigned int a : 5;
unsigned int b : 3;
unsigned int c : 20;
unsigned int d : 4;
} bit_field_s;
在如上定义中,bit_field_s结构体只占用一个DWORD的空间,即4个字节。其中成员a占用5位,成员b占用3位,成员c占用20位,成员d占用4位。我们可以对 bit_field_s结构体的成员进行如下赋值:
bit_field_s x;
x.a = 4;
x.b = 7;
x.c = 1024;
x.d = 13;

 

2、sizeof(string)会根据编译器的不同而不同。我的VS2010是32,面试宝典上是http://www.cnblogs.com/wanghetao/archive/2012/04/04/2431760.html

string是一个类而已sizeof(class)
#include<iostream>
#include<string>
using namespace std; int main(int argc, char *argv[])
{
string strArr1[]={"Trend","micro","Soft"};
string *pStrArr1=new string[2];
pStrArr1[0]="US";
pStrArr1[1]="CN";
int W=sizeof(strArr1);
int L=sizeof(string);
int N=sizeof(strArr1)/sizeof(string);
int M=sizeof(pStrArr1)/sizeof(string);
for(int i=0;i<sizeof(strArr1)/sizeof(string);i++)
cout<<strArr1[i];
for(int j=0;j<sizeof(pStrArr1)/sizeof(string);j++)
cout<<pStrArr1[j];
return 0;
}

 

3、虚函数与虚函数表http://www.cnblogs.com/Ripper-Y/archive/2012/05/15/2501930.html