2010-08-24 30 views
1

我有一個類,它有一個構造函數,它需要一個const char*。它是:明確初始化的效率

c::c(const char* str) { 
    a = 32; 
    f = 0; 
    data = new char[strlen(str)]; 
    memcpy(data, str, strlen(str)); 
} 

而且一個函數,它接受其中的一個:

int foo(c& cinst); 

您可以通過它傳遞一個c的實例調用這個函數:

c cinst("asdf"); 
foo(cinst); 

,或者因爲我們有明確的初始化,你可以這樣做:

foo("asdf"); 

這將通過構造函數「asdf」創建一個c,然後將生成的對象傳遞給foo

但是,這看起來可能會比僅僅將foo重載爲const char*效率低很多。是否值得爲速度做過載或者性能影響如此之小以至於浪費空間來實現超載?我試圖儘可能快地完成我的程序,所以速度是一個重要因素,尺寸也是如此,但不是那麼重要。

+0

您不復制很可能是錯誤的'\ 0'終止符。此外,你調用'strlen'兩次,這違背了你儘可能快的目標;)我建議如下:'data = new char [strlen(str)+ 1]; strcpy(data,str);'。 – fredoverflow 2010-08-24 17:00:12

+1

你有沒有聽說過畫家施萊米爾? Google for it :)之後,看看你對'strlen'的調用 – 2010-08-24 17:02:40

+1

@Mac:兩次調用'strlen'並不像調用n次那樣糟糕;) – fredoverflow 2010-08-24 17:04:08

回答

1

fooconst char*有什麼關係?如果它只是讓它自己擁有c對象,那麼沒有意義。

如果要使用直接char*(和現有foo只是拉着char*c的對象),那麼這將是最好編寫過載。

+0

正是我需要的答案。 – 2010-08-24 17:06:55

0

它不會佔用零時間,所以它是您必須採取的折衷之一,速度與api清晰度之間的關係。當然,這取決於你在你的函數中做了什麼,它需要一個const char *,你在構造一個c對象嗎?在這種情況下,只需提供具有c類接口的功能即可。

0

這類問題最好用分析器回答。 查看它的彙編代碼也可能提供線索。

0

這是情景。它實際上取決於給定情況下構造函數中的實際內容以及代碼實際執行的次數。

在你給的例子中,那些在構造函數中是非常平凡的操作。在任何合理的現代處理器上,這些操作將非常快速。所以除非這個代碼每秒鐘執行很多次,否則我甚至不會擔心它。 (當然,「巨大」的價值取決於你希望運行什麼樣的機器,對於這個構造函數,在典型的桌面處理器上,我甚至不會擔心,直到它達到至少每秒數百次)

如果此構造代碼的運行次數很多,那麼您仍然應該對其進行概況分析並確定它是否與其他所有事情相比具有顯着的影響在你的程序中。優化是一件棘手的事情。有時,你的直覺所說的效率低下,實際上對最終結果影響不大。測量總是能夠確定你應該在哪裏花費時間來最有效地使程序運行得更快。