[英]C++ Compiler or Linker optimization
我正在嘗試使用類映射創建一個自動加載類系統,如本文最佳回答:
所以我根據自己的需要創建了這段代碼:
// 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類和foo.cpp文件底部定義了REGISTER_DEC_TYPE我放了:REGISTER_DEF_TYPE(foo)...(AddScripts函數由主程序調用,所以它通常在二進制文件中鏈接)
它編譯得很好但是當我嘗試調試時,我無法在visual studio中設置斷點來顯示這個提示:“沒有可執行代碼與此行相關聯。可能的原因包括:預處理器指令或編譯器/鏈接器優化”
並在foo.cpp中顯示:“已為此文檔加載任何符號”
所以我猜編譯器沒有找到任何“正常”調用這些函數/類從二進制代碼中刪除它們。
有沒有辦法避免這種優化? 我找到了解決這個問題的跨平台解決方案。
提前致謝
Deadstripping是工廠代碼的常見問題。 您通常需要做的是在某個地方使用所有類型的功能。 它很難看,但不幸的是沒有特別優雅的便攜式解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.