Gcc5.3.0中调试和发布之间的奇怪行为

时间:2016-11-30 14:40:59

标签: c++ c++11 c++14

情况

我使用Mingw在Window 7上提供的GCC 5.3.0,并使用gtest来实现和运行单元测试。

在我的项目中,我有一个计算机层次结构,它实现了如下所示的接口Computer

class Dataset; // Not

// Interface Computer
class Computer {
public:
    // Destructor virtual to enable vmap
    virtual ~Computer() noexcept = default;

    // Pure virtual fonctions
    virtual bool preCompute(Dataset &datas) const = 0;
    virtual void compute(Dataset &datas) const = 0;


};

我将此接口的抽象实现提供为ChainableComputer,它实现了另一个接口(Chainable)和precompute的默认实现。见下文。

class ChainableComputer : public Computer, public Chainable {
    public:
         bool preCompute(Dataset &dataset) const  override;
};

这些类位于命名空间中,名为core,并打包在core.dll

在另一个dll中,我在另一个名称空间ChainableComputer中实现了domain

有些实现很简单,并且在preCompute中没有任何事情可做,因此,它们以相同的方式实现计算:

class SomeComputerImpl  : public ChainableComputer{
/// ...
void compute(Dataset &datas) const override final{
       auto result = preCompute(datas);
       if(!result){
          throw;
       }
}
};

这段代码正在传播,所以我决定重构并在Computer中添加一个受保护的方法:

class Computer  {
/// ...
protected:
    // Helper function for some implementations of Computer
    void doPrecomputeOrThrow(Dataset &datas) const{
       auto result = preCompute(datas);
       if(!result){
          throw;
       }
    } 
}

我不希望这种行为成为计算机的默认行为,但它让我有可能更改这些计算机的实现,如下所示:

class SomeComputerImpl  : public ChainableComputer{
/// ...
void compute(Dataset &datas) const override final{
       doPrecomputeOrThrow(Dataset &datas);
}
};

它在应用程序和单元测试中编译并运行良好...如果我在发布模式下编译并运行。

如果我选择Debug,编译工作,应用程序工作,但测试不会。

我试着理解它会发生什么,但我无法弄清楚可能出现的问题。我想它与链接器有关,并且接口,抽象实现和具体实现是分离DLL的事实,我们在另一个可执行文件中运行这些东西......

我已经尝试了什么

  1. 直接在test =>中实施ChainableComputer按预期工作
  2. inline =>上播放__attribute__(always_inline)doPrecomputeOrThrow没效果
  3. 在命名空间中实现doPrecomputeOrThrow(将计算机*作为参数传递),在core.dll =>中没效果
  4. 在命名空间中实现doPrecomputeOrThrow(将计算机*作为参数传递),在domain.dll =>中按预期工作
  5. 在课程或命名空间中将doPrecomputeOrThrow作为模板实施,Computer作为模板参数(参见下文)=>按预期工作
  6. 在课堂上实施doPrecomputeOrThrow作为模板,Dataset作为模板参数(见下文)=>没效果

    //作为Computer(静态或非静态)成员的工作模板,或 //在命名空间中 模板 void doPrecomputerOrThrows(AComputer * c,Dataset& datas);

    //作为Computer成员的模板不起作用 模板 void doPrecomputerOrThrows(ADataset& datas);

  7. 问题

    有人知道会发生什么事吗?

0 个答案:

没有答案