簡體   English   中英

C ++編譯器或鏈接器優化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM