我已經很長一段時間,所以我覺得傻,不知道這種編程C++,但...初始化方法與構造函數加賦值 - 任何性能差異? (C++)
我經常寫性能敏感的代碼,當我做我會盡量避免堆分配爲儘可能多。爲此,我經常重新使用預先分配的小對象數組,而不是爲每個單獨的對象調用new和delete。
在這種情況下,我通常這樣做:
class MyClass
{
private:
int x, y;
public:
inline void Set(_x, _y) { x = _x; y = _y; }
};
...
MyClass &objectToReuse = someArray[someIndex];
objectToReuse.Set(someXValue, someYValue);
不過我懷疑這更好看的版本會產生相同的代碼:
class MyClass
{
private:
int x, y;
public:
inline MyClass(_x, _y) : x(_x), y(_y) {}
};
...
MyClass &objectToReuse = someArray[someIndex];
objectToReuse = MyClass(someXValue, someYValue);
一個現代的C++編譯器會「得到」它,還是會構造一個臨時對象然後複製它?
如果您的對象很簡單,它會使0差異,並可能會產生類似的,如果不相等,**優化**代碼。如果在構造函數或非默認賦值運算符(如輸出或更改外部存儲器)中有副作用或者對象使用虛函數,則使用setter會產生更高效的代碼。但是,我很確定它不會是你的程序的性能問題=)。 – UnknownGosu