小编Gam*_*per的帖子

CM支持GCC的链接时间优化(LTO)

我有最新的cmake构建并尝试所有构建配置(Debug,MinSizeRel,RelWithDebugInfo,Release,General)我在生成的makefile中看不到(文本搜索)字符串-lto,所以或者功能仍然不存在,或者它需要手动转换(在这种情况下,文档搜索LTO或链接时间优化)文档没有结果,所以我在官方文档中看不到启用LTO的方法.

是否有任何方法可以"全局"(对于所有编译器)启用LTO,而无需指定仅由GCC支持的手动标志?

cmake lto

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

Rust cargo.toml 为 C 链接器和编译器指定自定义路径

由于我对货物设置和大量文档的无知,我遇到了一些问题。

cargo.toml 文件是当前的:

[package]
name = "hello"
version = "0.1.0"
authors = ["PC4\\Author"]

[dependencies]
sdl2 = { version = "0.34.1", features = ["bundled", "static-link"] }
Run Code Online (Sandbox Code Playgroud)

SDL2 依赖项已编译,但实际上使用的是 Visual Studio。我真正想做的是在编译 crate 依赖项时使用另一个文件夹中的自定义编译器。

rust sdl-2 rust-crates rust-cargo

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

是否已知类型已知的"接受",访问者模式的有效优化?

考虑以下访问者的简单语言解释器.

public interface Visitor{
    void visit( VarStat vs);
    void visit( Ident i);
    void visit( IntLiteral a);
    void visit( Sum s);
}
Run Code Online (Sandbox Code Playgroud)

为了完整起见,我添加了一些代码,提供了必要的实现细节(您可以跳过并直接阅读问题).

public interface Visitable{
    void accept( Visitor v);
}

public class VarStat implements Visitable{
    Ident i;
    Exp   e;

    public VarStat(Ident id, Exp ex){
        i = id;
        e = ex;
    }

    public Ident getIdent() { return i; }
    public Exp getExp() { return e; }

    @Override
    public void accept( Visitor v){
        v.visit( this);
    }
}

public interface Exp extends Visitable{ …
Run Code Online (Sandbox Code Playgroud)

java visitor code-design

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

Travis CI,使用包缓存更新CMake

实际上我正在使用这个片段在travis虚拟机中预安装所需的编译器版本

 - os: linux
  compiler: clang
  addons:
    apt:
      sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.5']
      packages: ['clang-3.5']
  env: COMPILER=clang++-3.5
Run Code Online (Sandbox Code Playgroud)

这具有在机器内运行构建而不使用sudo更快构建的优点.

当使用travis时,如何使用它在linux和osx上安装cmake 2.8.12(或更新版本)?我试过了

  - os: linux
  compiler: clang
  addons:
    apt:
      sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.5', 'add-apt-repository']
      packages: ['clang-3.5', 'ppa:kalakris/cmake']
  env: COMPILER=clang++-3.5
Run Code Online (Sandbox Code Playgroud)

没有成功

cmake package travis-ci

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

C#属性检测未使用的方法

是否可以编写一个可以跟踪方法的属性来检测这些方法是否从未被调用过?

[Track]
void MyMethod(){

}
Run Code Online (Sandbox Code Playgroud)

输出:

warning: method "MyMethod" in "MyClass" has no references in code.
Run Code Online (Sandbox Code Playgroud)

在编译时运行它并不是绝对必要的,但它应该在应用程序初始化时起作用(无论如何在编译时更好).

这个标签将用于跟踪音频库上的方法,因为音频经常被重构,我们通常在代码中搜索带有0个引用的音频方法,我们想要标记这些方法,这样我们就可以快速检测并删除未使用的音频资产.

基本上每次我们添加新的声音效果时,我们以后可能不再触发它(调用它的方法),并且音频文件/播放代码可以在应用程序中保留很长时间.

c# reflection custom-attributes

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

实现安全nullptr

我想保持我的代码可以在遗留C++(使用"NULL"的C++代码)和新的C++ 11标准(使用"nullptr"的C++代码)上编译

我正在使用GCC,但是当我完成最重要的事情时,我还计划为VS重新编译整个代码库.

我是否应该期待GCC和VS都会这样做

#define NULL nullptr
Run Code Online (Sandbox Code Playgroud)

或者我自己会做得更好(当然使用不同的名称,其中MY_LIB将被我的库后缀替换)?

#ifndef nullptr
    #define MY_LIB_NULL NULL
#else
    #define MY_LIB_NULL nullptr
#endif
Run Code Online (Sandbox Code Playgroud)

我想要实现的是编译的代码,无论C++ 11的功能是否已经实现(并且因为我没有使用模板,所以它们很少).

例如,关键字"覆盖"和"最终"已经完成.

MY_LIB_OVERRIDE //macro, defines to "override" if c++11 is present.
MY_LIB_FINAL    //macro, defines to "final" if c++11 is present.
Run Code Online (Sandbox Code Playgroud)

我问这个问题是因为我知道"nullptr"问题有点奇怪,所以也许只是我已经为覆盖和最终做了同样的事情,这是错误的.需要对此提出意见.任何帮助都很好.

c++ overriding final nullptr c++11

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

C++如何在shared_ptrs的向量中存储多个类型?

我怎样才能在std :: vector中存储多个shared_ptr,每个shared_ptr都有一个指向不同类型的指针?

std::vector < ? > vec;
vec.push_back( make_shared<int>(3));
vec.push_back( make_shared<float>(3.14f));
Run Code Online (Sandbox Code Playgroud)

是否有一个基本的多态类可以用于该任务而不必使用特定于编译器的东西?

c++ polymorphism templates vector shared-ptr

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

构造函数中的c ++异常安全性

怎么样下面的代码

MyClass a(new Foo(), new Bar());
Run Code Online (Sandbox Code Playgroud)

如果"new Foo()"成功,但"new Bar()"抛出,Foo会泄漏吗?

正在服用

std::unique_ptr<Foo>
Run Code Online (Sandbox Code Playgroud)

要么

std::shared_ptr<Foo>
Run Code Online (Sandbox Code Playgroud)

作为参数,足以防止泄漏?

c++ exception shared-ptr unique-ptr c++11

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

在C++中检查double是否为2的幂而没有位操作的代码

为了检查double是否是2的幂,我发现了这段代码:

unsigned long long int &p= *(unsigned long long int *) &x;
unsigned int exp= (p >> 52) & 0x7FF;
if ( exp == 0 || exp == 0x7FF ) return false;
return (p & 0xFFFFFFFFFFFFFULL) == 0; 
Run Code Online (Sandbox Code Playgroud)

但是它无法对某些体系结构进行基本测试.我想这是因为整数的长度不同.所以我试图找出一个不做位操作的简单替代方案:

bool isPot(double a ){
    return a==0.? false : (1./a)*a==1.;
}
Run Code Online (Sandbox Code Playgroud)

假设任何除以2的幂的除数在尾数中产生无限数字,因此由于值被截断,所以当乘以其倒数时它不会产生1.

然而,它显然是有效的,但我无法证明,因为对所有值进行测试需要大约140年.

建议?

MyTests:

assert(isPot(2.0)); //first solution fails here
assert(isPot(0.5));
assert(!isPot(5.0));
assert(!isPot(0.2));
Run Code Online (Sandbox Code Playgroud)

通过2的幂,我的意思是一旦存储在RAM中,该值就是2的幂.所有尾数位为0的数字.这隐含地是一个具有固有错误的解决方案,因为假设以下值:

2.000000000000000000000000000000000000000000000000000000000000003
Run Code Online (Sandbox Code Playgroud)

它将被转换为

2.0
Run Code Online (Sandbox Code Playgroud)

所以返回true是因为所有尾数位都为0,但最初它不是2的幂.

c++ floating-point double

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

为password_hash存储的盐在哪里?

根据(相对)新的PHP文档:

password_hash功能使用随机盐(我们不应该担心.. O_O),所以如果我理解正确的盐具有保存在某个地方,否则用户将无法登录到网站之后登录(不同的盐=>不同的哈希值.)

函数文档没有说明与数据库交互的任何信息,因为我认为存储每个用户数据只能通过数据库进行扩展,那么该函数存储随机盐是什么?txt会话数据这样的文件?

php password-protection

6
推荐指数
2
解决办法
1509
查看次数