我创建了一个具有可变参数模板方法的类.这个方法调用printf
函数.将零参数传递给方法时,我得到gcc的编译警告说:
警告:格式不是字符串文字而没有格式参数[-Wformat-security]
一个简化的类示例是:
class printer{
std::map<int,std::string> str;
public:
printer(){
str[0] = "null\n";
str[1] = "%4d\n";
str[2] = "%4d %4d\n";
str[3] = "%4d %4d\n%4d\n";
}
template<typename ...Args>
void print(Args... args){
printf(str[sizeof...(args)].c_str(),args...);
}
};
Run Code Online (Sandbox Code Playgroud)
使用时
printer p;
p.print(23);
p.print(345,23);
Run Code Online (Sandbox Code Playgroud)
一切顺利,但使用时
printer p;
p.print();
Run Code Online (Sandbox Code Playgroud)
我收到编译警告
main.cpp: In instantiation of ‘void printer::print(Args ...) [with Args = {}]’:
main.cpp:23:11: required from here
main.cpp:17:50: warning: format not a string literal and no format arguments [-Wformat-security]
printf(str[sizeof...(args)].c_str(),args...);
Run Code Online (Sandbox Code Playgroud)
当然,如果我只是打电话
printf("null\n");
Run Code Online (Sandbox Code Playgroud)
没有警告出现.
有人可以解释为什么会这样吗?
我可以在不禁用-Wformat-security
标志的情况下删除警告吗?
假设我有一个struct
带有固定大小数组成员的C/C++,例如:
#define SIZE 10000
struct foo{
int vector_i[SIZE];
float vector_f[SIZE];
};
Run Code Online (Sandbox Code Playgroud)
我想创建一个函数,它将返回一个实例foo
,如:
foo func(int value_i, float value_f){
int i;
foo f;
for(i=0;i<SIZE;i++) f.vector_i[i] = value_i;
for(i=0;i<SIZE;i++) f.vector_f[i] = value_f;
return f;
}
Run Code Online (Sandbox Code Playgroud)
如果我使用以下方法调用函数:
foo ff = func(1,1.1);
Run Code Online (Sandbox Code Playgroud)
编译器会执行某种优化(即TCO)吗?
将可执行填写直接ff
变量,或将填补第一f
的func
,然后所有值从复制f
到ff
?
如何检查是否执行了优化?
我是一个使用LAPACK例程的新手,所以我不太了解它们,我想在并行循环(openmp)中使用它们.
我使用Ubuntu 14.04LTS并使用我的包管理器安装LAPACK.安装的版本是:
liblapack3 3.5.0-2ubuntu1 Library of linear algebra routines 3 - shared version
Run Code Online (Sandbox Code Playgroud)
相关的BLAS库是:
libblas3 1.2.20110419-7
Run Code Online (Sandbox Code Playgroud)
所以,我的第一个问题很简单:我可以在使用OpenMP并行化的循环中使用LAPACK的任何子例程或函数吗?Id est,他们是安全的吗?
另一个问题是:我可以在我的纯子程序中使用LAPACK的任何子程序或函数吗?id est,在我编写的子程序中定义为纯子程序.
如果这些问题的答案是"不是所有LAPACK程序,而是其中一些程序",那么,我可以使用以下子程序吗?:
最后一个问题:LAPACK程序是否使用了我的所有内核?,id est,它们是否已经并行?
我想使用variadic模板构建一个哈希码队列.最小的示例代码是
template<typename T>
void hash_queue(queue<size_t>& q){
q.push( typeid(T).hash_code() );
}
template<typename T, typename... Ts>
void hash_queue(queue<size_t>& q){
hash_queue<Ts...>(q);
q.push( typeid(T).hash_code() );
}
int main(){
queue<size_t> q;
hash_queue<int, float, double>(q);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在编译我得到
main.cpp: In instantiation of ‘void hash_queue(std::queue<long unsigned int>&) [with T = float; Ts = {double}]’:
main.cpp:19:22: required from ‘void hash_queue(std::queue<long unsigned int>&) [with T = int; Ts = {float, double}]’
main.cpp:25:35: required from here
main.cpp:19:22: error: call of overloaded ‘hash_queue(std::queue<long unsigned int>&)’ is ambiguous
hash_queue<Ts...>(q);
^
main.cpp:19:22: …
Run Code Online (Sandbox Code Playgroud) 我在Makefile中的目标中运行以下命令.
target1:
<run some command which creates ids.log>
$(eval id1 := $(shell cat ids.log | head -1))
@echo id is $(id1)
<some other command which uses the value $(id1)>
Run Code Online (Sandbox Code Playgroud)
我的任务是获取"ids.log"中的第一行并将其保存在变量id1中,这样我就可以使用我将在此目标中执行的命令中的值.
运行此命令时出错"cat:ids.log:没有这样的文件或目录".看起来$(eval ..)命令在make的开头执行而不是作为目标make的一部分执行.由于在完成目标make之前不会创建ids.log,因此我们会收到此错误.
任何人都可以帮助我如何获取我执行的shell命令的值并将其放入变量以供按需使用?
我必须以A'A
或更一般的形式计算一些乘积A'DA
,其中A
是一般mxn
矩阵,D
是对角mxm
矩阵。他们两个都是全职。即rank(A)=min(m,n)
。
我知道这样的对称乘积可以节省大量时间:鉴于对称的乘积A'A
,您只需要计算乘积矩阵的对角线的下部或上部。这增加了n(n+1)/2
要计算的条目,大约是n^2
大型矩阵典型值的一半。
我想利用这节省了很多钱,而且我知道我可以在for
循环中实现矩阵-矩阵乘法。但是,到目前为止,我一直在使用BLAS,它比for
我自己可以编写的任何循环实现都要快得多,因为它可以优化缓存和内存管理。
有没有一种方法可以有效地计算A'A
甚至A'DA
使用BLAS?谢谢!
我正在我的项目中进行一些类型检查.以下示例
using namespace std;
cout << ( is_convertible<ostream,ostream>::value ? "TRUE":"FALSE" ) << endl;
Run Code Online (Sandbox Code Playgroud)
返回"FALSE".
有人能解释为什么吗?
我有一些元素的数组.我想创建一个函数,它将生成一个包含元素引用的reference_wrapper数组.
有一个界面的东西:
template<typename T, size_t N>
std::array<std::reference_wrapper<T>,N> wrap(std::array<T,N>& a);
Run Code Online (Sandbox Code Playgroud)
最好的方法是什么?
注意:我不想使用矢量.