gpt4 book ai didi

c++ - 是否可以在不增加包含对象大小的情况下添加私有(private)成员变量?

转载 作者:行者123 更新时间:2023-12-02 18:42:03 25 4
gpt4 key购买 nike

我有一个名为 ObjectCounter 的小型实用程序类,它没有虚拟方法,也没有成员变量;它只包含一个构造函数和一个析构函数,它们分别递增和递减一个全局变量:

int _objectCount = 0;  // global

class ObjectCounter
{
public:
ObjectCounter() {printf("DefaultCtor: count=%i\n", ++_objectCount);}
~ObjectCounter() {printf("Dtor: count=%i\n", --_objectCount);}
};

当我想跟踪我的程序在任何给定时间创建的另一个类的实例数时,我只需添加一个 ObjectCounter 作为该类的私有(private)成员变量:

class SomeUserClass
{
public:
SomeUserClass() : _userData(0) {/* empty */}
~SomeUserClass() {/* empty */}

private:
ObjectCounter _objectCounter;
int64_t _userData;
};

(本来我会用那个类的子类 ObjectCounter 来代替,但是那样做就是生成 my DOxygen class-graphs unnecessarily complex ,所以我改为将它变成一个私有(private)成员变量)

今天我注意到将这个“空”私有(private)成员变量添加到我的类对象中通常会增加类对象的大小(如 sizeof() 所报告的)。例如,以下代码显示当我包含 _objectCounter 成员变量时,sizeof(SomeUserClass) 在我的机器上从 8 增加到 16:

int main(int, char **)
{
SomeUserClass sc1;
printf("sizeof(SomeUserClass)=%zu\n", sizeof(SomeUserClass));
printf("sizeof(ObjectCounter)=%zu\n", sizeof(ObjectCounter));

return 0;
}

无论是否启用优化(通过 -O3)都会发生增加。

我认为这是因为编译器正在为 _objectCounter 成员变量分配空间,这样如果其他一些代码需要获取指向 ObjectCounter 的指针,那么唯一的地址可以被提供。但是我的程序中没有任何代码真正引用了 _objectCounter 变量;它的存在只是为了在适当的时候执行自己的默认构造函数和析构函数。

鉴于此,是否有任何方法可以鼓励(或更好地强制)编译器不为该成员变量分配任何空间?

最佳答案

如果可以使用C++20,可以使用属性[[no_unique_address]]来完成这个。使用

#include <cstdio>
#include <cstdint>

int _objectCount = 0; // global

class ObjectCounter
{
public:
ObjectCounter() {printf("DefaultCtor: count=%i\n", ++_objectCount);}
~ObjectCounter() {printf("Dtor: count=%i\n", --_objectCount);}
};

class SomeUserClass
{
public:
SomeUserClass() : _userData(0) {/* empty */}
~SomeUserClass() {/* empty */}

private:
[[no_unique_address]] ObjectCounter _objectCounter;
int64_t _userData;
};

int main(int, char **)
{
SomeUserClass sc1;
printf("sizeof(SomeUserClass)=%zu\n", sizeof(SomeUserClass));
printf("sizeof(ObjectCounter)=%zu\n", sizeof(ObjectCounter));

return 0;
}

输出:

DefaultCtor:  count=1
sizeof(SomeUserClass)=8
sizeof(ObjectCounter)=1
Dtor: count=0

关于c++ - 是否可以在不增加包含对象大小的情况下添加私有(private)成员变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67879282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com