2008-12-23 46 views
2

我想根據類模板類型對齊我的成員變量,但我不確定它是否實際可行。通過模板類型對齊成員變量

下面是一個的想什麼,我做

template<int Align> 
class MyClass 
{ 
private: 
    struct MyStruct 
    { 
    // Some stuff 
    } __declspec(align(Align)); 

    __declspec(align(Align)) int myAlignedVariable; 
}; 

所以我想爲對齊是每個實例變量,只有通過這是非常簡單的例子班級內容的排列值決定。

不幸的是,我總是碰到下面的錯誤

error C2975: 'test::MyClass' : invalid template argument for 'Align', expected compile-time constant expression 

那麼,這實際上可能或可以排列只能用一個固定的編譯時間常數可能嗎?如果沒有,任何人都可以想辦法解決這個問題嗎?

謝謝:)

回答

5

自對準不標準,所以編譯器處理它是如何達到他們 - 看起來像VC++不喜歡__declspec結合模板。

我提出一個變通使用專業化,這樣的事情:

template<int A> struct aligned; 
template<> struct aligned<1> { } __declspec(align(1)); 
template<> struct aligned<2> { } __declspec(align(2)); 
template<> struct aligned<4> { } __declspec(align(4)); 
template<> struct aligned<8> { } __declspec(align(8)); 
template<> struct aligned<16> { } __declspec(align(16)); 
template<> struct aligned<32> { } __declspec(align(32)); 

,然後從推導代碼:

template<int Align> 
class MyClass 
{ 
private: 
    struct MyStruct : aligned<Align> { 
    // stuff 
    }; 
}; 

這不幸的是打破MYSTRUCT的POD的煩躁。它也不適用於內置/現有類型,因此您必須爲這些類型使用包裝。

aligned_t<int, 4> myAlignedVariable; 
+2

爲什麼不讓他「對齊」MyStruct的第一個成員?那麼它仍然是莢。 – 2008-12-23 21:50:16

3

Boost已經解決了這個問題。他們使用boost::optionallink to header)中的技術,該技術必須爲對齊的任意類型保留足夠的空間,但不能(不會)在構造時實際實例化該對象。

他們的解決方案是分配一個簡單的字節池(char數組)並使用就地新建來在所需位置構造對象。賦予就地新的地址可以是任意對齊的。

這就是說,你是說你給你的問題一個非常簡單的例子。通過實現一個類,每個成員都有一個用戶指定的對齊方式,但每個成員的對齊方式並不相同,但每個類實例可能會有所不同,您試圖通過何種方式解決實際問題?

+0

這就是我現在用我們的分配模型正在做的事情,它運行良好。但是有人要求我們可以確保如果結構在分配器之外,那麼這個對齊就會被強制執行。 說實話,我很高興我們已經完成了這項工作,並且已經證實了這一點。 – 2008-12-25 22:45:00