C++ 编译器或链接器优化

标签 c++ optimization compiler-construction linker autoload

我正在尝试使用本文最佳答案中指定的类映射来创建一个自动加载类系统:

Is there a way to instantiate objects from a string holding their class name?

所以我根据自己的需要创建了这段代码:

// ScriptLoader.h
template<class TScript> void createScript() { 
    new TScript; 
}

struct ScriptFactory {
public:
    typedef void(*ScriptCreatorFunc)();
    typedef std::map<std::string,ScriptCreatorFunc> ScriptCreatorStorage;

    static ScriptCreatorStorage ScriptCreators;

    static bool RegisterCreator(std::string const& s,ScriptCreatorFunc creator)
    {
        ASSERT(ScriptCreators.find(s) == ScriptCreators.end());   // prevent registering the same script twice
        ScriptCreators.insert(std::make_pair(s,creator));
        return true;
    }
};

template<class TScript>
struct ScriptReg : ScriptFactory { 
    ScriptReg(std::string const& s) { 
        ScriptFactory::RegisterCreator(s,&createScript<TScript>);
    }
};

class ScriptLoader {
public:
    static void AddScripts()
    {
        for (ScriptFactory::ScriptCreatorStorage::iterator itr = ScriptFactory::ScriptCreators.begin(); itr != ScriptFactory::ScriptCreators.end(); ++itr)
            itr->second();
    }    
};

#define REGISTER_DEC_TYPE(NAME) \
    static ScriptReg<NAME> reg

#define REGISTER_DEF_TYPE(NAME) \
    ScriptReg<NAME> NAME::reg(#NAME)


// ScriptLoader.cpp
ScriptFactory::ScriptCreatorStorage ScriptFactory::ScriptCreators;

// foo.cpp
class foo:
{
    public:

        foo()
        {
                /* code */
        }

    private:
        REGISTER_DEC_TYPE(foo);
};

REGISTER_DEF_TYPE(foo);

当然,我已经在 foo 类中定义了 REGISTER_DEC_TYPE,并在 foo.cpp 文件的底部放置了:REGISTER_DEF_TYPE(foo) ...(AddScripts 函数改为由主程序调用,因此它通常在二进制文件中链接)

它编译得很好,但是当我尝试调试时,我无法在显示此提示的 visual studio 中设置断点:“没有可执行代码与此行关联。可能的原因包括:预处理器指令或编译器/链接器优化”

在 foo.cpp 中显示:“已为该文档加载任何符号”

所以我猜编译器没有发现对这些函数/类的任何“正常”调用,将它们从二进制代码中删除。

有什么办法可以避免这种优化吗?我正在寻找解决此问题的跨平台解决方案。

提前致谢

最佳答案

Deadstripping 是工厂代码的常见问题。您通常需要做的是在某处使用您所有类型的函数。它很难看,但遗憾的是没有特别优雅的可移植解决方案。

关于C++ 编译器或链接器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15022056/

相关文章:

c++ - QlistView如何更改标准项选择

c - OpenCL 内核执行速度比单线程慢

mysql - 优化mysql查询: medal standings

python - 计算列表中非唯一项的总数

gcc - 更改 GCC 中的指令集

c# - C# 编译器如何处理显式转换运算符的重载?

c++ - C++ 和 Spotify API 入门

c++ - 如何使用 stringstream 作为 C++ 函数的参数?

c++ - 虚幻引擎 4 fatal error C1083

c++ - 如何强制编译器将 C 名称改写为 C++ 名称