我有以下函数,可以采用不同类型的N个参数,并以这种方式将它们转发到每个单独类型模板化的N个函数(带有两个参数的示例):
template <typename T1, typename T2>
bool func(int& counter, T1 x1, T2 x2) {
switch (counter) {
case 0:
if (func2<T1>(x1)) {
counter++;
return true;
} else {
return false;
}
case 1:
if (func2<T2>(x2)) {
counter++;
return true;
} else {
return false;
}
default:
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
我想用可变参数模板编写这个函数,以便它可以以类型安全的方式处理任意数量的参数.我可以看到一个使用递归函数的解决方案,传递计数器和可变参数索引并比较它们的相等性,但这似乎产生的效率远远低于上面的switch语句(if-checks序列与跳转表相比) ).
这可以使用模板元编程有效地完成,还是我需要为每个arity提供重载?
c++ templates template-meta-programming variadic-templates c++14
我有这个小代码片段(这是我遇到的问题的最小工作示例):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void xorBuffer(unsigned char* dst, unsigned char* src, int len)
{
while (len != 0)
{
*dst ^= *src;
dst++;
src++;
len--;
}
}
int main()
{
unsigned char* a = malloc(32);
unsigned char* b = malloc(32);
int t;
memset(a, 0xAA, 32);
memset(b, 0xBB, 32);
xorBuffer(a, b, 32);
printf("result = ");
for (t = 0; t < 32; t++) printf("%.2x", a[t]);
printf("\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码应该执行两个32字节的内存缓冲区(概念上,应该这样做a = a ^ b).由于0xAA ^ 0xBB …
有没有办法让OpenCL给我一个列出所有具有OpenCL实现的独特物理设备?我知道如何遍历平台/设备列表但是,例如,在我的情况下,我有一个英特尔提供的平台,它为我的CPU提供了高效的设备实现,以及为我的GPU提供快速实现的APP平台但是我的CPU可怕的实现.
有没有办法解决这两个CPU设备实际上是同一个物理设备,这样我就可以选择最有效的设备并使用它,而不是同时使用它们并让它们相互竞争计算时间单个物理设备?
我已经看过CL_DEVICE_VENDOR_ID和CL_DEVICE_NAME,但他们不解决我的问题上,CL_DEVICE_NAME将是同一型号的两个单独的物理设备一样(双GPU的),并CL_DEVICE_VENDOR_ID给了我一个不同的ID为根据不同的平台上我的CPU.
一个理想的解决方案是某种独特的物理设备ID,但我很乐意手动更改OpenCL配置以自行重新排列设备(如果可能的话).
现代CPU可以在两个原生大小的字之间执行扩展乘法,并将低和高结果存储在单独的寄存器中.类似地,当执行除法时,它们将商和余数存储在两个不同的寄存器中,而不是丢弃不需要的部分.
是否存在某种可移植的gcc内在函数,它将采用以下签名:
void extmul(size_t a, size_t b, size_t *lo, size_t *hi);
Run Code Online (Sandbox Code Playgroud)
或类似的东西,以及分裂:
void extdiv(size_t a, size_t b, size_t *q, size_t *r);
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过在代码中抛出#ifdef来使用内联汇编和shoehorn可移植性来实现它,或者我可以使用部分和来模拟乘法部分(这将显着更慢)但我想避免这样做以便于阅读.当然有一些内置函数可以做到这一点?
我不确定这是一个doxygen还是一个dot问题,但是这里有.
在项目中,我需要包括常见的头这么多的文件stdlib.h,stdint.h等.当我要求doxygen为我的每个文件生成依赖图时,这会导致很多混乱和噪音,因为绘图工具总是重用现有节点并且从不复制它们.
我可以以某种方式告诉doxygen从生成的图形中排除一组标题,完全忽略它们吗?在构建文档时,我宁愿不使用可怕的预处理器技巧来删除#include.
我找到了一些人问同一个事情的邮件列表线程,但他们要么没有得到回复,也没有关于玩依赖图最大深度的建议,这根本不起作用,因为标题可以包含在任何深度(这样做)最终咀嚼我自己的本地标题).
我已经实现了一个多处理下载器.如何打印可在终端的不同部分自动刷新的状态栏(完整速率,下载速度).
像这样:
499712 [6.79%] 68k/s // keep refreshing
122712 [16.79%] 42k/s // different process/thread
99712 [56.32%] 10k/s
Run Code Online (Sandbox Code Playgroud)
码:
download(...)
...
f = open(tmp_file_path, 'wb')
print "Downloading: %s Bytes: %s" % (self.file_name, self.file_size)
file_size_dl = 0
block_sz = 8192
start_time = time.time()
while True:
buffer = self.opening.read(block_sz)
if not buffer:
break
file_size_dl += len(buffer)
f.write(buffer)
end_time = time.time()
cost_time = end_time - start_time
if cost_time == 0:
cost_time = 1
status = "\r%10d [%3.2f%%] %3dk/s" % (file_size_dl,
file_size_dl * 100. / …Run Code Online (Sandbox Code Playgroud) 我有一个需要尽可能快的函数,它只使用整数运算.它运行在AMD64架构上,我需要做一些推/弹,以便有足够的寄存器来使用.现在我想知道,x64 ABI声明前四个浮点寄存器(XMM0,XMM1,XMM2和XMM3)是易失性的,不需要在函数调用之间保留.
所以我想我可以通过movq(MMX或SSE指令集)而不是使用堆栈来保存我需要保存在这些寄存器的低64位(即MM0,MM1,...)中的64位寄存器,从而节省了自己的工作.一些内存加载/存储.此外,我不需要使用EMMS来存储FPU状态 - 这会破坏目的 - 因为我实际上并没有操纵浮点寄存器而只是使用它们作为存储(而且无论如何,x87单元根本不使用x64,因为它基本上被SSE取代)
我已经做了修改并且它可以工作(没有崩溃,并且可观察到性能提高了4%),但是我想知道,这个"黑客"真的有用吗还是会引入我可能错过的任何特殊副作用(比如FPU状态)腐败,即使我不使用它,那种事情).加载/存储到FPU寄存器总是比任何当前架构上的内存加载/存储更快?
而且,是的,真的需要这种优化.公平地说,这不会严重降低代码维护成本,单行评论就足以解释这个伎俩.因此,如果我可以免费获得每个字节少的时钟而不会产生意想不到的后果,我很乐意接受它们:)
谢谢.
这件事让我难过.我有一个课程如下:
public class SpecialList implements List<MyType> {
// overriden methods
}
Run Code Online (Sandbox Code Playgroud)
现在我有以下方法合同要尊重更高级别:
public class MyClass {
private List<SpecialList> bigList = new ArrayList<SpecialList>();
public void doStuff(List<MyType> list)
{
bigList.add((SpecialList)list); // does not compile - invalid cast
}
}
Run Code Online (Sandbox Code Playgroud)
我真的不确定我在这里做错了什么.我有一个实现List<MyType>接口的类,但我不能将该类转换为List<MyType>?这对我没有任何意义.
我搞不清楚了.我应该做些什么来完成这项工作?我想这与泛型协方差有关,但此时我不知道这里有什么问题.有人能指出正确的方向吗?谢谢.
我有一个文件夹结构,我的所有源文件都在./src/中,我的所有目标文件都在./obj/中(具有相同的内部目录结构,使用路径替换进行镜像).我创建了以下makefile:
$(EXECUTABLE): $(OBJECTS)
@echo Linking $(EXECUTABLE)...
$(CXX) $(LDLIBS) $(OBJECTS) -o $(EXECUTABLE)
%.o: $(subst o,cpp,$(subst obj/,src/,$@))
@echo Building $@...
$(CXX) $(CPPFLAGS) -c $(subst o,cpp,$(subst obj/,src/,$@)) -o $@
Run Code Online (Sandbox Code Playgroud)
哪个不行!Make一直声称目标文件是最新的,即使源文件实际上比目标文件旧.另一方面,如果我这样做:
obj/main.o: src/main.cpp
@echo Building $@...
$(CXX) $(CPPFLAGS) -c src/main.cpp -o $@
Run Code Online (Sandbox Code Playgroud)
对于每个源文件,它都可以完美运行.我检查了,两个subst给出了相同的结果(obj/main.o成为src/main.cpp,如预期的那样).然而,由于某种原因,Make不接受依赖.
这给了我很多的悲伤,有人可以解释我哪里出错了吗?我不明白发生了什么,我认为我的替换会起作用,因为它给出了相同的输出.我不被允许使用subst,或者$@依赖于什么?
这个小代码片段与 g++ 6.2.0 和 clang++ 3.8.1 的段错误:
clang++ -std=c++11 -O3 -mavx -pthread 或者 g++ -std=c++11 -O3 -mavx -pthread
#include <thread>
#include <iostream>
class alignas(32) AlignedObject {
public:
float dummy[8];
};
int main() {
while (true) {
std::thread([](){
AlignedObject x;
std::cout << &x;
std::thread([x](){
std::cout << &x;
}).join();
}).join();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
查看反汇编,两个编译器都插入vmovaps了失败的指令,这表明某处编译器生成的对象没有正确对齐。-mavx由于不再使用该指令,因此删除它可以正常工作。这是编译器错误还是该代码依赖于未定义的行为?