【问题标题】:C++ - Difference between pointer of a class and object of class in initializationC ++ - 初始化中类的指针和类的对象之间的区别
【发布时间】:2015-01-26 05:25:18
【问题描述】:

在 C++ 中 假设我有

class Sample{
 public:
 void someFunction();
};

在main()中做有什么区别

Sample obj;
obj.someFunction();

AND

Sample *obj = new Sample();
obj->someFunction();

这只是语法问题还是存在性能/实现差异?什么时候应该使用一个而不是另一个?

【问题讨论】:

    标签: c++ class


    【解决方案1】:

    这很简单——与堆和栈有关

    Sample obj;
    obj.someFunction();
    

    obj 在栈上

    Sample *obj = new Sample();
    obj->someFunction();
    

    在堆上。

    这需要删除。它也存在于范围之外。

    性能差不多

    【讨论】:

    • 有道理!谢谢。
    • 处理器缓存 - 堆栈上的东西更容易优化
    • 您能否详细说明或指出我可以阅读针对堆栈变量优化的处理器缓存的某个地方?我不知道存在性能差异。
    • 我认为操作系统在执行程序之前对堆栈上的变量有更好的了解(因为它们是已知的编译时间)。这可能会打开在程序执行时将堆栈变量提升到缓存的可能性
    • software.intel.com/en-us/blogs/2009/08/24/… 当作用域开始时,编译器也会知道东西的位置。
    【解决方案2】:
    Sample obj;
    obj.someFunction();
    

    在这种情况下,它是静态分配。 obj 的内存分配在 main() 函数的堆栈区。

    Sample *obj = new Sample();
    obj->someFunction();
    

    在另一种情况下,您使用 new 运算符动态创建了对象。 它在堆内存中分配。 使用后,你应该使用 delete 操作符释放它。

    delete obj;
    

    所以除此之外没有其他区别。在动态分配的情况下,我们必须根据需要分配和释放内存。 但是在静态分配中,分配发生在声明时,而释放发生在变量的作用域结束时。

    【讨论】:

    • 不是静态对象
    猜你喜欢
    • 2013-12-02
    • 1970-01-01
    • 2013-02-11
    • 2011-09-12
    • 2016-08-23
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多