2012-01-18 75 views
6

我查看了GCC STL(4.6.1),看到std::copy()使用優化版本,以防內置的__is_trivial()評估爲truestd :: copy/memcpy/memmove優化

由於std::copy()std::reverse_copy()模板對於複製數組中的元素非常有用,所以我想使用它們。然而,我有一些類型(這是模板實例化的結果),它們是包含一些普通值的結構,沒有指針,也沒有複製構造函數或賦值運算符。

G ++是否足夠聰明地發現我的類型實際上是微不足道的?在C++ 98中有沒有辦法確保STL實現知道我的類型是微不足道的?

我想在C++ 11中,使用is_trivial<>類型特徵會變得很方便。這是正確的嗎?

謝謝!

編輯:對不起,這麼晚了,但這裏是一個很簡單的Type類的例子,這對GCC和llvm來說並不重要。有任何想法嗎?

#include <iostream> 

struct Spec; 

template <typename TValue, typename TSpec> 
class Type 
{ 
public: 
    TValue value; 

    Type() : value(0) {} 
}; 

int main() 
{ 
    std::cerr << "__is_trivial(...) == " 
       << __is_trivial(Type<char, Spec>) << '\n';                                                          
    return 0; 
} 
+3

C++ 03 PODs forbit默認構造函數也如果我記得,這可能是什麼防止這是微不足道的。 – 2012-01-18 16:59:34

+0

@MooingDuck:謝謝,我認爲這是解釋。連同Mathieu的回答,這回答了我的問題。 – Manuel 2012-01-18 17:21:21

回答

5

對於trivial的含義有一些爭議。

舉例來說,就我所知,你的例子並不是一般的可構造的(std::is_trivially_default_constructible會返回false我認爲)。

在你的情況,我認爲你需要新的特點std::is_trivially_copyable,這是更細粒度。所以......升級你的編譯器?

4

__is_trivial給出所有類型的正確值。

不能依賴任何特定的STL實現來使用它,儘管如果編譯器供應商提供了它,那麼它可能包含各種針對特定編譯器的場景改進。

C++ 11的std::is_trivial只是標準化這個功能,沒有理由不使用它。

+0

顯然'__is_trivial'不能推斷出類型是否可以複製。 :(請參閱我的更新中的示例。 – Manuel 2012-01-18 16:54:13