小编jap*_*iss的帖子

为什么MSVC在寄存器中返回一个小结构时不必要地使用堆栈?

我在MSVC 2013,x64,使用/ 02的发布版本上编译了以下代码:

struct Point
{
    int x;
    int y;
};

Point xUnit()
{
    Point p;
    p.x = 1;
    p.y = 0;
    return p;
}
Run Code Online (Sandbox Code Playgroud)

生成的汇编代码为xUnit():

mov QWORD PTR p$[rsp], 1
mov rax, QWORD PTR p$[rsp]
ret 0
Run Code Online (Sandbox Code Playgroud)

为什么它写入堆栈然后立即读回来rax返回?

我原以为:

mov rax, 1
ret 0
Run Code Online (Sandbox Code Playgroud)

c++ optimization assembly visual-studio visual-c++

12
推荐指数
1
解决办法
363
查看次数

深度图像压缩到最大允许误差

有关图像压缩的文章通常侧重于在给定固定压缩比的情况下生成最佳图像质量(PSNR).我很好奇在给定最大允许的每像素误差的情况下获得最佳压缩比.我的本能是贪婪地删除转换数据中的最小系数,跟踪我引起的错误,直到我不能删除任何更多而不传递最大错误.但是我发现没有任何文件可以证实.谁能指点我对这个问题的参考?


编辑

让我提供一些细节.我正在尝试从3D扫描仪压缩深度图像,而不是常规图像.颜色不是一个因素.深度图像往往具有大的平滑斑块,但精确的不连续性是重要的.某些像素将为空 - 在扫描仪范围之外或低置信度 - 并且不需要压缩.

在此输入图像描述

该算法需要快速运行 - 最佳速度为30 fps,如Microsoft Kinect,或至少在100毫秒区域内的某个位置.该算法将包含在我分发的库中.我更喜欢最小化依赖性,因此我可以在相当少量的代码中实现自己的压缩方案.

compression algorithm image data-structures

10
推荐指数
1
解决办法
1137
查看次数

可以为数据成员都实现operator +的类自动生成operator +吗?

给定一个普通的数据C++类或由实现的类型组成的结构operator+:

struct VertexData
{
    Vec4 vertex;
    Vec2 texCoord;
};
Run Code Online (Sandbox Code Playgroud)

是否可以使用模板或其他技巧让C++编译器自动生成operator+添加每个成员,如下所示?

VertexData operator+(VertexData const &a, VertexData const &b)
{
     VertexData sum;
     sum.vertex = a.vertex + b.vertex;
     sum.texCoord = a.texCoord + b.texCoord;
     return sum;
}
Run Code Online (Sandbox Code Playgroud)

c++ templates

8
推荐指数
2
解决办法
354
查看次数

用于展平容器容器的通用功能

我试图更好地掌握迭代器和泛型函数.我认为编写一个转换container1 < container2 <type> >为的函数是一个有用的练习container3 <type>.例如,它应该能够转换vector< deque<int> >list<int>.

我认为所有容器访问都应该通过迭代器,就像函数一样<algorithm>.

这是我的代码:

#include <iterator>
#include <algorithm>

// COCiter == Container of Containers Iterator
// Oiter == Output Iterator
template <class COCiter, class Oiter>
void flatten (COCiter start, COCiter end, Oiter dest)
{
    using namespace std;

    while (start != end) {
        dest = copy(start->begin(), start()->end(), dest);
        ++start;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在以下代码中调用它时:

int main ()
{
    using namespace std;

    vector< vector<string> > splitlines;
    vector<string> flat; …
Run Code Online (Sandbox Code Playgroud)

c++ generics containers templates

7
推荐指数
1
解决办法
3167
查看次数

为什么Visual Studio在解除引用之前递增循环指针?

我从以下SIMD代码中检出了Visual Studio 2012的程序集输出:

    float *end = arr + sz;
    float *b = other.arr;
    for (float *a = arr; a < end; a += 4, b += 4)
    {
        __m128 ax = _mm_load_ps(a);
        __m128 bx = _mm_load_ps(b);
        ax = _mm_add_ps(ax, bx);
        _mm_store_ps(a, ax);
    }
Run Code Online (Sandbox Code Playgroud)

循环体是:

$LL11@main:
    movaps  xmm1, XMMWORD PTR [eax+ecx]
    addps   xmm1, XMMWORD PTR [ecx]
    add ecx, 16                 ; 00000010H
    movaps  XMMWORD PTR [ecx-16], xmm1
    cmp ecx, edx
    jb  SHORT $LL11@main
Run Code Online (Sandbox Code Playgroud)

为什么增加ecx16,只有当存储到下一行时减去16?

c++ assembly code-generation pipelining visual-studio-2012

7
推荐指数
1
解决办法
294
查看次数

WaitForMultipleObjects()是否重置所有自动重置事件?

我有一个等待几个自动重置事件的事件循环.这些事件都初始化为数组eventHandles_CreateEvent(NULL, false, false, NULL).

while (true)
{
    DWORD waitResult = WaitForMultipleObjects(3, eventHandles_, false, INFINITE);
    switch (waitResult)
    {
    case WAIT_OBJECT_0 + 0:
        //handle event...

    case WAIT_OBJECT_0 + 1:
        //handle event...

    case WAIT_OBJECT_0 + 2:
        //handle event...
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题:如果事件1和2同时发生,循环将处理,WAIT_OBJECT_0 + 1因为它是第一个.但是当循环再次出现时,事件2是否仍会发出信号?还是会自动重置?

windows events winapi multithreading asynchronous

6
推荐指数
1
解决办法
1558
查看次数

使Python的argparse接受单字符缩写为subparsers?

我正在使用argparse优秀的subparser系统来制作一个接受许多不同命令的命令行程序.根据我的阅读,argparse当它们明确无误时,会自动接受参数的单字符缩写.我想让它为subparsers做同样的事情.如果我像这样设置我的subparser:

    foo_parser = subparsers.add_parser('foo')
    # ... set up arguments and handler ...

    bar_parser = subparsers.add_parser('bar')
    # ... set up arguments and handler ...
Run Code Online (Sandbox Code Playgroud)

然后我希望解析器接受myprogram f arg0作为明确的缩写myprogram foo arg0.但事实并非如此.

有任何想法吗?

python command-line argparse

6
推荐指数
1
解决办法
3469
查看次数

使用抽象类进行事件处理程序回调是惯用Python吗?

我正在构建一个事件调度程序框架,它解码消息并回调用户代码.我的C++背景表明我写道:

class Handler:
    def onFoo(self):
        pass
    def onBar(self):
        pass

class Dispatcher:
    def __init__(self):
        self.handler = Handler()

    def run():
        while True:
            msg = decode_message() # magic
            if msg == 'foo':
                handler.onFoo()
            if msg == 'bar':
                handler.onBar()
Run Code Online (Sandbox Code Playgroud)

然后框架用户会写如下:

class MyHandler(Handler):
    def onFoo(self):
        do_something()

dispatcher = Dispatcher()
myHandler = MyHandler()
dispatcher.handler = myHandler
dispatcher.run()
Run Code Online (Sandbox Code Playgroud)

但我也可以设想把onFoo()onBar()作为方法,Dispatcher并让用户用其他方法替换它们.然后用户的代码看起来像:

def onFoo():
    do_something()

dispatcher = Dispatcher()
dispatcher.onFoo = onFoo
Run Code Online (Sandbox Code Playgroud)

我还可以制作Dispatcher.onFoo一个callables列表,这样用户就可以在C#中附加多个处理程序.

什么是最恐怖的方式呢?

python events callback

5
推荐指数
1
解决办法
400
查看次数

如何获得凸包中均匀分布的点?

给定一组点,

points = np.random.randn(...) # n 3d points
Run Code Online (Sandbox Code Playgroud)

我想均匀地填充由凸包定义的体积,其中它们位于nx33d 点列表( np.array of shape )中。

我可以得到凸包

hull = scipy.spatial.ConvexHull(points)
Run Code Online (Sandbox Code Playgroud)

获得均匀填充该船体体积的点列表的最快方法是什么?

python numpy scipy convex-hull computational-geometry

4
推荐指数
1
解决办法
2846
查看次数

确保衍生进程的窗口位于主应用程序的前面?

在我的GUI应用程序中,我使用C#Process类来生成可能启动窗口的外部进程.子进程窗口可以通过第三方API调用显示,因此并不总是可以获得窗口句柄.有没有办法确保子进程的窗口显示在主应用程序窗口的前面?

.net c# windows

3
推荐指数
1
解决办法
2978
查看次数