【问题标题】:How to Statically Allocate Memory to an Array of Pointers to a Struct如何将内存静态分配给指向结构的指针数组
【发布时间】:2019-05-05 13:55:45
【问题描述】:

我正在尝试将内存静态分配给指向名为“mini”的结构的指针数组。 “迷你”结构用作存储索引和数据的一种方式,因此我可以通过对指向该结构的指针进行排序来进行间接排序。当我声明数组时,数组被分配内存来存储指针,但指针本身没有为“迷你”结构分配任何内存。重要的是它是静态分配的,因为它是排序算法的一部分,所以我试图避免动态内存分配。

这是 mini 的声明和指向 mini 的指针数组:

typedef struct {
    long long index;
    string data;
} mini;

static mini* ssn[1010000];

我可以动态分配如下:

for (int j = 0; j < 1010000; j++){
    ssn[j] = new mini();
}

当我尝试为每个指针静态分配内存时,问题就出现了。以下是我尝试过的一些事情:

static mini* ssn[1010000] = {{0,""}};

static mini* ssn[1010000]  = {{new mini()}};

这些都没有成功编译。 有没有办法为数组中的每个指针静态分配内存?

【问题讨论】:

  • 您没有声明一个名为 ministruct,而是一个名为 mini 的匿名 struct 的实例。看起来你来自 c 并且在这里混淆了很多东西。
  • 第一个问题是你没有使用std::vector,而不是简单的数组。第二个问题是为什么要立即分配1010000 元素?

标签: c++ memory


【解决方案1】:

你有一个指针数组,你想用不同的值(分配结果)初始化数组(每个指针元素)。除了为每个元素提供一个值之外,没有办法在声明时进行这种初始化:

static mini* ssn[4] = {new mini(), new mini(), new mini()};

您尚未为其提供值的每个元素都将使用默认值0 进行初始化。

如果需要定长数组,最好使用std::array。 C++ 有强大的类型系统,使用它。在这种情况下,初始化可以泛化:

struct Mini {
    int x;
};

template <class Ar, class F, size_t... I>
static auto init(F factory, std::index_sequence<I...>) noexcept {
    return Ar{factory(I)...};
}

using Array = std::array<Mini*, 20>;
static Array ssr(init<Array>([](...) { return new Mini(); }, std::make_index_sequence<20>()));

实际上是一样的:

static Array ssr(Array{new Mini(), new Mini(), ...})

编译器将优化Array 副本。注意,这个解决方案需要 c++14,虽然它可以适应 c++11。

【讨论】:

    猜你喜欢
    • 2018-04-15
    • 2022-01-14
    • 1970-01-01
    • 2018-05-16
    • 2013-04-18
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    相关资源
    最近更新 更多