同樣的代碼在windows平台和在Linux平台上運行結果不同?
題主將下面的代碼分別在Windows上用VS編譯和在Linux上用g++編譯了一遍,運行結果卻是不一樣的,我很困惑,這只是一個簡單的字元串的測試代碼。為什麼不同的平台不一樣?下面是代碼:
Windows運行結果:Linux運行結果:str3 和 str4的地址在Windows上不一樣,在Linux上是一樣 的,這是為什麼啊,我覺得str3和str4的地址應該是一樣的啊。。。
OS就這麼躺槍了,這也太冤了吧。
這是個編譯選項的問題。即便同一個編譯器,用不同選項都會決定是否合併同樣的字元串常量。如果合併的話,內容相同的字元串常量就會是同樣的地址。
而頭兩個str[]的寫法,是搞出了兩個數組,把字元串分別拷貝過去,所以肯定不同地址。VC++運行的是debug吧,release有一項可以修改的優化就是問你要不要合併相同字元串常量的地址。
char *str3 = "Hello, World";
char *str4 = "Hello, World";
後者常量字元串被歸併了吧,值相同,被優化成同一個地址了。
我是來瞎說的,
你可知 copy on write, 簡單的說,就是我比較懶,不想做太多事情,就借用的別人的東西(如果這樣做無傷大雅的話)有的編譯器發現char *str3 = "Hello, World";
char *str4 = "Hello, World";
丫的, str3 和 str4 的內容完全相同,大家比較懶嘛,就共用了一個 "Hello, World" (在常量區)。
題外話,對於在常量區的 "Hello, World", 你根本就不能改變,在上面深究指針,地址的意義是不大的。這個是實現相關的行為 最好的辦法是避免這麼用 比如使用const char * 去防止修改字元串常量
這都是編譯器的區別,和平台沒關係。你在win下用gcc編譯看看,還是不一樣的結果嗎?
編譯器優化
首先一點是編譯器處理效果不同,與平台無關。
第二點至於gcc編譯器為何這樣處理是因為char *str3 = "HelloWorld"這裡面的"HelloWorld"是字元串常量不能被改變,str3指向這個字元串常量所存儲的地址,因為不能被改變所以同理str4也讓他指向這塊地址。這樣做避免了過多的內存浪費。
第三點當然是gcc的處理效果更好,因為VS又重新開闢了一塊存儲相同字元串常量的空間。
第四點最新的VS2015可能也是默認這樣處理的(答主沒試過...)。推薦閱讀:
※linux真的比windows更適合web開發者作為開發環境嗎?
※Linux 錄屏軟體有哪些?
※微軟有沒有可能為Linux系統開發桌面環境?
※Linux 下 halt, poweroff, shutdown 有什麼區別?
※Linux 與 OS X 哪個更適合個人使用?為什麼?
TAG:MicrosoftWindows | Linux | C | MicrosoftVisualStudio |