小编Lig*_*ink的帖子

将3D点投影到2D平面

设A是我有3D坐标x,y,z的点,我想将它们转换为2D坐标:x,y.投影应在由给定法线定义的平面上正交.平凡的情况,其中法线实际上是其中一个轴,它很容易解决,只是简单地消除了一个坐标,但其他情况如何更容易发生?

math 3d geometry 2d plane

32
推荐指数
2
解决办法
4万
查看次数

new [],删除[]复杂性

我已经知道new[]运算符首先分配内存,然后为每个元素调用构造函数,并且delete[]运算符首先为每个元素调用析构函数,然后释放内存,因此,它们都具有O(n)时间复杂度.

但是如果我有一个类,我没有定义任何构造函数/析构函数,复杂性仍然是O(n),还是只是O(1)?

例如,如果我有两个类:

class foo
{
public:
    int a;
    foo()
    {
        a = 0;
        // more stuff
    }
    ~foo()
    {
        a = 1;
        // some useful stuff here
    }
};

class boo
{
public:
    int a;
};
Run Code Online (Sandbox Code Playgroud)

我创建了两个这样的数组:

int n = 1000;
foo* pfoo = new foo[n];
boo* pboo = new boo[n];
Run Code Online (Sandbox Code Playgroud)

我很确定第一个new调用会有O(n)复杂度,但第二个调用呢?将new只分配必要的内存,就是这样,还是会调用一些默认的构造函数(我不知道,如果这样的事情居然在退出C++)每个元素?

同样的问题delete:

delete [] pfoo;
delete [] pboo;
Run Code Online (Sandbox Code Playgroud)

当我删除第二个数组时,复杂性仍然是O(n),还是只会delete以O(1)复杂度释放内存?

c++ memory-management time-complexity

15
推荐指数
1
解决办法
1665
查看次数

取消引用迭代器性能

我有3个功能,分别来自下面的代码,运行800x800次:

while下面的每个循环之前运行正好800次iter1 == lim,因此测量持续时间为800x800x800(512百万)次.

iter1,iter2并且lim是double指针.他们指向一个足够大的矢量double.

sum是一个double局部变量.

s1并且s2是当地unsigned int的,都等于800.

首先在2.257秒内运行:

while ( iter1 < lim )
{
    sum += *iter1 * *iter2;
    ++iter1;
    iter2 += s2;
}
Run Code Online (Sandbox Code Playgroud)

第二次运行7.364秒:

while ( iter1 < lim )
{
    sum += *iter1 * *iter2;
    iter1 += s1;
    iter2 += s2;
}
Run Code Online (Sandbox Code Playgroud)

第三次运行1.355秒:

while ( iter1 < lim )
{
    sum += *iter1 * *iter2;
    ++iter1; …
Run Code Online (Sandbox Code Playgroud)

c memory performance pointers

-6
推荐指数
2
解决办法
131
查看次数

标签 统计

2d ×1

3d ×1

c ×1

c++ ×1

geometry ×1

math ×1

memory ×1

memory-management ×1

performance ×1

plane ×1

pointers ×1

time-complexity ×1