2008-12-23 101 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