gpt4 book ai didi

c++ - 在方法中实例化对象与创建类成员

转载 作者:行者123 更新时间:2023-11-30 01:46:51 24 4
gpt4 key购买 nike

在方法中实例化对象而不是使对象成为类成员的原因有哪些?

例如,在下面的示例代码中,我有一个要从另一个类(如 USer1)使用的类 ClassA,它具有指向类 A 的对象的指针作为成员变量并在其构造函数中实例化,另一方面User2,在使用它之前在方法中实例化 classA 的对象。以一种方式与另一种方式相比有哪些原因?

class ClassA
{
public:
void doStuff(void){ }
};

//
// this class has ClassA as a member
//
class User1
{
public:
User1()
{
classA = new ClassA();
}

~User1()
{
delete classA;
}

void use(void)
{
classA->doStuff();
}
private:
ClassA *classA;
};

//
// this class uses ClassA only in a method
//
class User2
{
public:
void use(void)
{
ClassA *classA = new ClassA();
classA->doStuff();
delete classA;
}
};

int main(void)
{
User1 user1;
user1.use();

User2 user2;
user2.use();

return 0;
}

最佳答案

使其成为类成员的优点是:

  • 您不必每次都分配实例,这取决于类可能会非常慢。
  • 成员可以存储状态(尽管有些人会说这是个坏主意)
  • 更少的代码

作为旁注,如果您只是在构造函数和析构函数中使用 new 和 delete 进行实例化和删除,那么它真的不应该是指针,只是一个成员实例,然后去掉 new 和 delete。

浏览器

class User1
{
public:
void use(void)
{
classA.doStuff();
}
private:
ClassA classA;
};

有时情况并非如此,例如当分配到堆栈上的类很大时,或者您希望保持类的占用空间尽可能小。但这些都是异常(exception)而不是规则。

还有其他需要考虑的事情,例如内存碎片、访问连续内存块的优势以及如何在目标系统上分配内存。没有 Elixir ,只有一般性建议,对于任何特定程序,您都需要衡量和调整以获得最佳性能或克服特定程序的局限性。

内存碎片是指即使您有大量可用内存,但单个 block 的大小非常小,当您尝试分配大量内存时会出现内存错误。这通常是由于创建和销毁了许多不同大小的对象,其中一些还活着。如果您的系统存在内存碎片问题,我建议对对象的创建方式进行全面分析,而不是担心拥有或不拥有成员将如何影响系统。但是,以下是当您遭受内存碎片时四种不同情况的 segmentation :

  • 实例化堆栈上的类非常有用,因为它不会造成整体内存碎片。
  • 将其创建为值成员可能会导致问题,因为它可能会增加对象的整体大小,因此当您遇到碎片情况时,对象可能太大而无法创建。
  • 创建对象并存储指向它的指针可能会增加内存碎片
  • 在堆上分配并在使用结束时删除可能会增加内存碎片,如果在它之前分配了其他内容。

访问连续内存的优点是可以最大限度地减少缓存未命中,所以我的感觉是将对象作为值成员会更快,但是对于依赖于许多其他变量的许多事情,这可能是完全错误的。一如既往地谈到性能,衡量。

内存通常与特定边界对齐,例如 4 字节对齐,或 2 block 的幂。因此,根据您分配其中一个对象时对象的大小,它可能占用比您预期更多的内存,如果您分配的对象包含任何成员,如果它是值成员,则可能会显着改变类的内存占用,或者如果它不是它可能根本不会增加它,而有一个指向它的指针肯定会增加指针大小的足迹,这可能会导致显着增加。在堆上或堆栈上创建类都不会影响使用类的大小。与往常一样,如果它会影响您的程序,您需要在目标系统上进行测量以查看会产生什么影响。

如果构造函数/析构函数执行某些操作(例如文件句柄、打开文件和关闭文件),那么您可能只想在函数中使用它。但同样,指针通常不是必需的。

void use(void)
{
ClassA classA;
classA.doStuff();
} //classA will be destructed at end of scope

关于c++ - 在方法中实例化对象与创建类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32534486/

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