我在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) 有关图像压缩的文章通常侧重于在给定固定压缩比的情况下生成最佳图像质量(PSNR).我很好奇在给定最大允许的每像素误差的情况下获得最佳压缩比.我的本能是贪婪地删除转换数据中的最小系数,跟踪我引起的错误,直到我不能删除任何更多而不传递最大错误.但是我发现没有任何文件可以证实.谁能指点我对这个问题的参考?
让我提供一些细节.我正在尝试从3D扫描仪压缩深度图像,而不是常规图像.颜色不是一个因素.深度图像往往具有大的平滑斑块,但精确的不连续性是重要的.某些像素将为空 - 在扫描仪范围之外或低置信度 - 并且不需要压缩.

该算法需要快速运行 - 最佳速度为30 fps,如Microsoft Kinect,或至少在100毫秒区域内的某个位置.该算法将包含在我分发的库中.我更喜欢最小化依赖性,因此我可以在相当少量的代码中实现自己的压缩方案.
给定一个普通的数据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) 我试图更好地掌握迭代器和泛型函数.我认为编写一个转换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) 我从以下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?
我有一个等待几个自动重置事件的事件循环.这些事件都初始化为数组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是否仍会发出信号?还是会自动重置?
我正在使用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.但事实并非如此.
有任何想法吗?
我正在构建一个事件调度程序框架,它解码消息并回调用户代码.我的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#中附加多个处理程序.
什么是最恐怖的方式呢?
给定一组点,
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)
获得均匀填充该船体体积的点列表的最快方法是什么?
在我的GUI应用程序中,我使用C#Process类来生成可能启动窗口的外部进程.子进程窗口可以通过第三方API调用显示,因此并不总是可以获得窗口句柄.有没有办法确保子进程的窗口显示在主应用程序窗口的前面?
c++ ×4
python ×3
assembly ×2
events ×2
templates ×2
windows ×2
.net ×1
algorithm ×1
argparse ×1
asynchronous ×1
c# ×1
callback ×1
command-line ×1
compression ×1
containers ×1
convex-hull ×1
generics ×1
image ×1
numpy ×1
optimization ×1
pipelining ×1
scipy ×1
visual-c++ ×1
winapi ×1