sizeof小结
来源:互联网 发布:中国软件上市公司排名 编辑:程序博客网 时间:2024/06/06 02:02
一、用法
1. 用于数据类型
sizeof使用形式:sizeof(type)
数据类型必须用括号括住。如sizeof(int)。
2. 用于变量,表达式
sizeof使用形式:sizeof(var_name)或sizeof var_name
sizeof(expr) 或sizeof expr
ps. sizeof(expr) 时并不计算expr的值,它只返回存放该表达式的结果的类型的空间大小,特别的sizeof(*p),不需对p 解引用,p可以是个无效的地址
注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。
二、 结果
sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
1. 若操作数具有类型char、unsigned char或signed char,其结果等于1(ANSI C正式规定字符类型为1字节)。
2. int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、float、double、long double类型的sizeof 在ANSI C中没有具体规 定,大小依赖于实现
3. 对引用sizeof 返回存放此引用对象所需的内存空间大小
4. 例:
char *c;//uninitiallize,only for test
int len=sizeof(c);//len=4;
len=sizeof(*c)//len=1;不解引用,c所指向的内容类型所需的空间
5. 当操作数具有数组类型时,其结果是数组的总字节数。
void test(int a[])
{
//a 做为指针传递,相当于对指针取sizeof
int len=sizeof(a)/sizeof(int);//b=4/4
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[]={1,2,3};
int b=sizeof(a); //b=12//做为数组
test(a); //做为指针传递
}
6. 结构,类,联合的 sizeof
1.
class S1
{
};
int main(){
cout < <sizeof(S1) < <endl; //结果为1,为什么???
}
2.
class S1
{
char c;
// int i;
};
int main(){
cout < <sizeof(S1) < <endl; //结果为1
}
3.
class S1
{
// char c;
int i;
};
int main(){
cout < <sizeof(S1) < <endl; //结果为4
}
4.
class S1
{
char c;
int i;
};
int main(){
cout < <sizeof(S1) < <endl; //结果为8,为什么????
}
5、
class A
{
public:
int b;
float c;
char d;
};
int main(void)
{
A object;
cout < < "sizeof(object) is " < < sizeof(object) < < endl; //结果为12
return 0 ;
}
6.
class A
{
public:
static int a;
int b;
float c;
char d;
};
int main()
{
A object;
cout < < "sizeof(object) is " < < sizeof(object) < < endl; //结果还是12,为什么????
return 0 ;
}
7.
class A
{
public:
static int a;
int b;
float c;
char d;
int add(int x,int y)
{
return x+y;
}
};
int main()
{
A object;
cout < < "sizeof(object) is " < < sizeof(object) < < endl; //结果仍然是12
int b = object.add(3,4);
cout < < "sizeof(object) is " < < sizeof(object) < < endl; //结果仍然是12
return 0 ;
}
8.
class A{
char f;
double c;
char d;
};
int main(){
A a;
cout < <sizeof(a) < <endl; //结果为24,为什么?????
}
9.
class A{
double c;
char d;
char f;
};
int main(){
A a;
cout < <sizeof(a) < <endl;//char f;颠倒位置结果为16,为什么?????
}
1. 最少为1
2. 这个不用说了,大家都知道;
3, 也不用说;
4, 这是字节对齐的问题,char后面的int被放到了char的后四个字节的地方,是编译器的问题。这个自己可以自定义。
5, 3*4 = 12
6, static不在堆上
7, 结果仍然是12 ,不是虚函数,函数指针不在类中,如果函数里有一个virtual function,那么sizeof的值才会增加4个字节,(先不考虑具体的对齐)
8, 3*8 = 24 为了更快地访问到double
9, 8 + 8 = 16
具体原因参考:
http://blog.csdn.net/felixsxt/archive/2008/05/13/2442054.aspx
http://blog.csdn.net/felixsxt/archive/2008/05/13/2442062.aspx
- sizeof小结
- sizeof 小结
- sizeof小结
- sizeof 小结
- sizeof小结
- sizeof小结
- sizeof用法小结
- SIZEOF用法小结
- sizeof用法小结
- sizeof用法小结
- 关键字sizeof()小结
- 关键字sizeof()小结
- 小结:sizeof与strlen比较
- sizeof对指针运算小结
- C++ sizeof 与 strlen 小结
- strlen和sizeof的区别小结
- C++中sizeof 求 string 大小 小结
- C++ 预处理、const与sizeof 知识点 小结
- zend framework 1.5 出现 Internal 500 错误。
- 添加一个DeviceIoControl接口
- 正则表达式基础知识
- vc++中,用ado执行sql server存储过程,并且取得返回值的例子
- Java集合框架使用方法
- sizeof小结
- 证书管理工具ikeyman的命令版本gsk7cmd常用命令
- smarty精品教程一(高级篇)
- 纸牌、挖金子源码链接
- EXCEL VBA编程基础
- Sql語句中放帶參數的儲存過程
- SOHO一族,不要让“自由”的生活毁了健康!
- microwindows打印Wrong packet type的解决
- #define 特殊用法