代码之家  ›  专栏  ›  技术社区  ›  slashmais

在C++模板中强制相邻的分配边界吗?

  •  0
  • slashmais  · 技术社区  · 14 年前

    简单示例:

    template <class P> class MyT
    {
        struct Item
        {
        public:
            Item() {}
            P *pData;
            Item *next;
        };
        Item *head;
    public:
        ...adding etc..
        P* operator [](int index)
        {
           See question below:
        }
    };
    

    我是否可以确定‘Item’的分配方式,以便我可以按如下方式计算偏移量:(@Steve:)这里可能不太清楚;我需要的是一种快速简便的方法,无需遍历10000个next’即可到达该项。

    Item *pi = head + (sizeof(Item) * (index - 1));
    

    (clearer?) explanation 我的意思

    5 回复  |  直到 14 年前
        1
  •  1
  •   Steve Jessop    14 年前

    取决于你所说的“etc”,在“adding,etc”中是什么意思。

    next 指针。

    我想也许你把你的例子简化得太过分了。如果需要连续存储,请使用向量(以下任一 P Item 如果有什么有用的东西 你已经移除了)。如果您有连续存储,那么使用 下一个 指针,因为你可以用 项目 ,将1添加到 this (然后检查绑定以确保尚未到达结尾)。

    如果你真的需要公众 下一个 指针字段,因为它是您正在实现的某个接口的一部分,不能更改,所以您可以在复制构造函数中更新它,然后 operator= 对于 项目 ,接口最好禁止客户端向其写入。

    项目 需要超过 sizeof(Item) fixed-size allocator

        2
  •  1
  •   aeh    14 年前

    然而,如果你已经为项目分配了顺序内存,并且head指向了开头,以及Yossarian建议的修改,那么你正在尝试的将是可行的。

    注意:所有这些东西都用std容器包装。

        3
  •  1
  •   Ronny Brendel    14 年前

    “内存边界”可以通过特殊的gcc关键字强制实现

    http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html#Variable-Attributes

    看“对齐”

        4
  •  0
  •   Motti    14 年前

    operator new 对于 Item 并让分配器预先分配足够的内存来存储所有 项目 项目

    所有这些看起来都不现实,简单的解决办法是使用 std::vector .

        5
  •  -2
  •   nothrow    14 年前
    Item* pi = (head + (index - 1));
    

    struct Item 看起来像链表结构(包含 next