小编zti*_*tik的帖子

将零参数包传递给printf

我创建了一个具有可变参数模板方法的类.这个方法调用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标志的情况下删除警告吗?

c++ gcc variadic

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

编译器是否会优化返回具有固定大小数组的结构的函数?

假设我有一个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变量,或将填补第一ffunc,然后所有值从复制fff

如何检查是否执行了优化?

c c++ struct return-value return-value-optimization

8
推荐指数
1
解决办法
277
查看次数

LAPACK例程是否安全?

我是一个使用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程序,而是其中一些程序",那么,我可以使用以下子程序吗?:

  • dgetrs
  • dgetrf
  • dgetri
  • dgecon

最后一个问题:LAPACK程序是否使用了我的所有内核?,id est,它们是否已经并行?

multithreading fortran blas lapack

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

使用可变参数模板创建哈希队列

我想使用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)

c++ templates variadic variadic-templates c++11

5
推荐指数
2
解决办法
431
查看次数

目标下的makefile变量赋值

我在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命令的值并将其放入变量以供按需使用?

variables makefile eval

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

BLAS矩阵逐矩阵转置乘法

我必须以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?谢谢!

matrix linear-algebra blas

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

为什么ostream不能转换成ostream?

我正在我的项目中进行一些类型检查.以下示例

using namespace std;

cout << ( is_convertible<ostream,ostream>::value ? "TRUE":"FALSE" ) << endl;
Run Code Online (Sandbox Code Playgroud)

返回"FALSE".

有人能解释为什么吗?

c++ gcc c++11

2
推荐指数
1
解决办法
97
查看次数

将元素数组转换为reference_wrappered元素数组

我有一些元素的数组.我想创建一个函数,它将生成一个包含元素引用的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)

最好的方法是什么?

注意:我不想使用矢量.

c++ templates c++11 c++14

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