C++11新特性程序员C++

C++11新特性(14)-将sizeof用于类成员

2018-06-11  本文已影响38人  面向对象思考

sizeof运算符

sizeof运算符返回表达式或者类型所占内存空间的字节数。它返回一个size_t类型的常量表达式。

假设有下面的结构体:

struct Point3d{

   int x;

   int y;

   int z;

};

可以这样进行初始化:

   Point3d pt;

   memset(&pt, 0, sizeof(pt));

也可以这样初始化:

   Point3d pt1;

   memset(&pt1, 0, sizeof(Point3d));

也可以批量初始化:

   Point3d ptarray[100];

   memset(ptarray, 0, sizeof(ptarray));

许多和内存操作相关的处理都需要知道数据或类型占用内存空间的大小。这时就可以使用sizeof运算符。sizeof计算的对象可以是数据,也可以是类型。

有一点需要注意的是,如果运算的对象是指针,那么取得的就只能是指针本身的大小而不是指针指向数据的大小。例如下面的代码就不能初始化所有的x数组元素。

 int x[10];

 int *p = x;

 memset(p, 0, sizeof(p)/sizeof(*p));

C++中的sizeof

假设有如下结构体:

struct Image{

   int width;

   int height;

   char data[10000];

};

可以这样初始化data成员:

   Image image1;

   memset(image1.data, 0, sizeof(iamge1.data));

C++11以后,也可以这样初始化:

   Image image1;

   memset(image1.data, 0, sizeof(Image::data));

注意sizeof的的参数,可以不通过对象,直接使用作用域运算符来获取成员的大小。

小测验

下面的代码有问题么?

   int data[100];

   constexpr size_t cnt = sizeof(data)/sizeof(*data);

   int info[cnt * 2];

   memset(info, 0, sizeof(info));

作者观点

聚沙成塔,集腋成裘。一点一滴的变化,使C++变得越来越好用。


觉得本文有帮助?请分享给更多人。

关注【面向对象思考】,轻松学习每一天!

面向对象设计,面向对象编程,面向对象思考!

上一篇下一篇

猜你喜欢

热点阅读