我已经创建了一个代码块,就像这样.
proc()
{
Z* z = new Z();
}
Run Code Online (Sandbox Code Playgroud)
现在,在方法proc中声明的指针将只有范围直到proc.我想询问何时自动调用DTOR for z.当控件来自方法proc还是我的应用程序关闭时.
如果我们输入
MyObject *obj = [[MyObject alloc] init];
Run Code Online (Sandbox Code Playgroud)
"obj"是指向内存地址的指针.
...当我们创建一个int时,我们输入:
int x = 10;
Run Code Online (Sandbox Code Playgroud)
我们为什么不打字?
int *x = 10;
Run Code Online (Sandbox Code Playgroud)
问题是,为什么我们需要一个指向对象的指针而不是int,float等...
让我们考虑以下两个代码
第一:
for (int i=0;i<10000000;i++)
{
char* tab = new char[500];
delete[] tab;
}
Run Code Online (Sandbox Code Playgroud)
第二:
for (int i=0;i<10000000;i++)
{
char tab[500];
}
Run Code Online (Sandbox Code Playgroud)
峰值内存使用率几乎相同,但第二个代码运行速度比第一个快20倍.
问题
是因为第一个代码数组存储在堆上,而第二个数组存储在堆栈中?
这些可能是在c ++中声明数组(并为它们分配内存)的两种方法中的两种
1. int a[3];
2. int *b = new int[3];
Run Code Online (Sandbox Code Playgroud)
我想了解c ++如何以不同的方式处理这两者.
一个.在这两种情况下,我都可以使用以下语法访问数组:a[1]和b[1]
湾 当我尝试cout<< a和cout<< b,都打印相应数组的第一个元素的地址.
它看起来好像a和b都被视为指向数组的第一个元素的指针.
C.但奇怪的是,当我尝试这样做时cout << sizeof(a),sizeof(b)他们分别打印出不同的值 - 分别为4和12.
我不明白为什么在这种情况下sizeof(b),正在打印整个数组的大小.
c++ arrays pointers memory-management dynamic-memory-allocation
我知道在堆栈上分配内存比在堆上分配内存更快,但为什么堆内存分配更慢?是不是因为堆栈分配是连续的,因此问题是由于缓存局部性而出现的?不是分配后内存的使用情况,是分配时间较慢吗?
有一个类SomeClass包含一些操作此数据的数据和方法.它必须用一些参数创建,如:
SomeClass(int some_val, float another_val);
Run Code Online (Sandbox Code Playgroud)
比方说Manager,还有另一个类,它包含SomeClass并大量使用其方法.
那么,在性能(数据位置,缓存命中等)方面会更好,声明SomeClass作为成员的对象Manager并在Manager构造函数中使用成员初始化或将SomeClass的对象声明为unique_ptr?
class Manager
{
public:
Manager() : some(5, 3.0f) {}
private:
SomeClass some;
};
Run Code Online (Sandbox Code Playgroud)
要么
class Manager
{
public:
Manager();
private:
std::unique_ptr<SomeClass> some;
}
Run Code Online (Sandbox Code Playgroud) 好吧,经过一整年的编程并且只了解数组之后,我意识到了向量的存在(由 StackOverflow 的一些成员在我之前的一篇文章中)。我自己做了大量的研究和研究,并重写了我用数组、链表和向量编写的整个应用程序。此时,我不确定是否还会使用数组,因为向量似乎更加灵活和高效。由于它们具有自动增大和缩小大小的能力,我不知道我是否会同样多地使用数组。在这一点上,我个人认为数组的唯一优点是更容易编写和理解。数组的学习曲线没什么,向量的学习曲线很小。不管怎样,我确信在某些情况下使用数组和在其他情况下使用向量可能有充分的理由,我只是好奇社区的想法。我完全是一个新手,所以我认为我对两者的严格用法都不够了解。
如果有人稍微好奇的话,这就是我正在练习使用向量的应用程序。它真的很粗糙,需要大量的工作: https ://github.com/JosephTLyons/Joseph-Lyons-Contact-Book-Application
我一直认为 UE 比 Unity 更快,因为 UE 使用 C++ 和 Unity C#。C++ 的哲学在这里似乎被打破了,那就是你为你使用的东西付费。现在添加了反射和垃圾收集。那么,如果 UE4 是从 C++ 和另一个 C# 生成的,为什么它们会更快呢?
我很难看到如何在C++中安全地分配堆栈数组.
通常人们这样做:
int a[hugeNumber]{0}; //declare,allocate,inti to 0.
Run Code Online (Sandbox Code Playgroud)
由于堆栈溢出,这很容易失败.
我想以某种方式拆分声明和分配,并在try catch中进行分配.
显然这不起作用,因为数组在try之外是不可访问的.
try{
int a[hugeNumber];
}
catch(std::bad_alloc& e)
{
}
//code here can't use a because of scope.
Run Code Online (Sandbox Code Playgroud)
如果你只能通过分离声明和分配以安全的方式分配基于堆的数组,那么生成代码就无法使用基于堆栈的数组,不是吗?
我认为这主要是一种心理锻炼.我一直在考虑它,我没有看到任何地方说明问题.largeNumber在现实中是相对的.实际上,即使是正常的数字也可能导致分配失败,并且因为似乎没有办法安全地分配基于堆栈的数组,我要求显而易见的......"可以在生产代码中使用基于堆栈的数组吗?".我问以防万一有一些我不知道的语法.我真的很感激输入.
我发现了一个有趣的现象:
#include<stdio.h>
#include<time.h>
int main() {
int p, q;
clock_t s,e;
s=clock();
for(int i = 1; i < 1000; i++){
for(int j = 1; j < 1000; j++){
for(int k = 1; k < 1000; k++){
p = i + j * k;
q = p; //Removing this line can increase running time.
}
}
}
e = clock();
double t = (double)(e - s) / CLOCKS_PER_SEC;
printf("%lf\n", t);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在i5-5257U Mac OS上使用GCC 7.3.0来编译代码 …