- 論壇徽章:
- 2
|
回復(fù) 5# srdgame
你先這樣試試:
1. 初始化
map的初始化和4樓一樣。
作為一個函數(shù)中的static 對象, 初始化時機(jī)是控制線第1次到達(dá)定義處。
同時不要在main之前多線程訪問這個函數(shù)。
這樣就保證初始化順序是沒問題的。
2. 優(yōu)化
你用的應(yīng)該是msvc吧?
試試取消優(yōu)化后會不會得到正確結(jié)果?
再試試訪問一次那個用于插入項的全局對象。
有可能是因為插入項的全局對象沒有被使用, 而被鏈接器優(yōu)化了。
- ------ def.h ------
- #include <map>
- extern
- std::map
- <std::pair<std::string,int>
- ,std::string
- > msg;
- msg& instance() { static msg m; return m; }
- struct msg_init
- {
- msg_init(char const* v, int id, char const* m)
- {
- instance().insert
- (std::make_pair(std::make_pair(v,id), m);
- }
- };
- ------ version1.cpp ------
- #include "def.h"
- msg_init v1("V1", 1, "A1");
- ------ version2.cpp
- #include "def.h"
- msg_init v2("V2", 2, "B1");
- ------ linktest.cpp ------
- #include <iostream>
- #include "def.h"
- extern msg_init v1, v2;
- int main()
- {
- using namespace std;
- // 這里, 試試取消/添加下面2行
- // 會不會產(chǎn)生不同的輸出
- cout<<&v1<<endl;
- cout<<&v2<<endl;
- cout<<instance().size()<<endl;
- return 0;
- }
復(fù)制代碼 如果會輸出不同結(jié)果, 那就肯定不是因為初始化順序, 而是v1, v2被鏈接器排除了。
以前在cppblog看到過這樣的情況: http://www.cppblog.com/kevinlynx/archive/2010/02/10/105885.html
那個文章里使用的是一個const, 默認(rèn)是static鏈接, 所以我認(rèn)為可能會被優(yōu)化。
而外部鏈接, 應(yīng)該不會被優(yōu)化才對, 否則造成程序結(jié)果有可見差異。
后來也沒去驗證。
從你的情況來看, 可能真的會被優(yōu)化。 |
|