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

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++变得越来越好用。


觉得本文有帮助?请分享给更多人。
阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】

猜你喜欢

转载自blog.csdn.net/craftsman1970/article/details/80084276