假设我有一个内存要求为logN + 1的算法,其中N是问题的大小(要处理的位数).我建议第二个版本将此内存需求减少到(logN)/ 2 + 1.我已经了解到在Big-O分析中忽略了常量,因此算法版本都具有O(logN)的复杂性.
现在,如果我计算使用算法的第二版保存的内存,我得到
记忆保存在N = M(N)= 1 - [(logN)/ 2 + 1]/[logN + 1]
lim N→∞M(N)= 1/2
这表明渐渐地我将永远保存50%的内存.我很困惑为什么我无法在Big-O分析中看到这种收益?
我的第二个问题是:如果我对Big-O表示法的理解是错误的,那么突出显示第二版算法中保存的内存的正确方法是什么?
我通过引用将数组从 C# 传递到 C++/CLI 以用作输出参数。我的代码如下:
C#
ushort[] a = new ushort[1];
cppclr.method(ref a);
Run Code Online (Sandbox Code Playgroud)
C++/CLI
void method(array<ushort>^% a)
{
a = gcnew array<ushort>(5);
a[0] = 1;
a[1] = 2;
a[2] = 3;
}
Run Code Online (Sandbox Code Playgroud)
该代码编译良好并且不会产生任何错误。但是,我很困惑我在 C# 中创建的数组是否已被垃圾回收处理?我的困惑是,由于我在 C++/CLI 中分配了新的内存,因此之前的引用丢失了,应该通过垃圾回收来处理。该程序没有显示任何内存泄漏。我需要以其他方式处理这种情况吗?
我知道如果我们使用类,结构等构建我们的程序会有很大的帮助,但它在运行速度方面是否有帮助我们避免使用这些结构并根据基本的C++语法编写代码?
例如,我正在尝试编写一个适用于矢量的程序.现在,编写类向量并定义其类似于set_at_index(int i)设置i此向量的特定行的值的方法听起来很诱人.此外,我可以检查相关矢量的长度是否i<=N在哪里N.
我的困惑在于,使用这些例程,每个set_at_index使用的方法都需要一个"if"语句.因此,如果我希望我的代码运行得更快,我应该避免它并继续声明一个数组并手动注意没有内存泄漏?
有没有什么方法可以检查内存泄漏而不会增加代码速度的负担?