【问题标题】:Aligning Member Variables By Template Type按模板类型对齐成员变量
【发布时间】:2008-12-23 14:11:58
【问题描述】:

我想根据类模板类型对齐我的成员变量,但我不确定它是否真的可行。

以下是我想做的(非常)简单的示例

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

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

所以我希望 Align 成为每个实例的变量,只有这样才能决定类内容的 align 值。

不幸的是,我总是收到以下错误

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

那么,这实际上是可能的还是只能使用固定的编译时间常数才能实现对齐?如果没有,任何人都可以想办法解决这个问题吗?

谢谢:)

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    自定义对齐不在标准中,因此编译器如何处理它取决于他们 - 看起来 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;
    

    【讨论】:

    • 为什么不让他“对齐”MyStruct 的第一个成员呢?那么它仍然是 pod。
    【解决方案2】:

    Boost 已经解决了这个问题。他们使用boost::optional (link to header) 中的技术,它必须为对齐的任意类型保留足够的空间,但不能(不会)在构造时实际实例化该对象。

    他们的解决方案是分配一个简单的字节池(char 数组)并使用就地 new 在所需位置构造对象。给就地 new 的地址可以任意对齐。

    话虽如此,你是说你在你的问题中给出了一个非常简单的例子。您通过实现一个类来尝试解决的实际问题是什么,其中每个成员都有一个用户指定的对齐方式,该对齐方式不会因每个成员而异,但可以因每个类实例而异?

    【讨论】:

    • 这就是我目前正在使用我们的分配模型所做的事情,并且效果很好。但有人要求如果结构在分配器之外,我们可以确保强制执行对齐。老实说,我很高兴我们已经完成了这项工作,这已经证实了这一点。
    猜你喜欢
    • 2021-07-25
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 2023-03-31
    • 2017-02-19
    相关资源
    最近更新 更多