c++ - 在 C++ 中使用模板初始化的静态结构指针

标签 c++ templates memory-pool

我正在实现一个简单的 MemPool。 MemPool以LinkList的形式实现。但是我不知道要声明

static Node * free_mem_head;

正确。

template <int PIECE_SIZE>
class mempool {
private:
    struct Node {
        Node * next;
        char p_mem[PIECE_SIZE];
    };

    const static size_t bunch_size = 50;
public:
    static Node * free_mem_head;
    mempool();
    ~mempool();

    void * allocate();
    void deallocate(void *);
};




template <int PIECE_SIZE>
mempool<PIECE_SIZE>::mempool() {}

template <int PIECE_SIZE>
mempool<PIECE_SIZE>::~mempool() {

}

template <int PIECE_SIZE>
void* mempool<PIECE_SIZE>::allocate() {
    if (free_mem_head == NULL) {
        size_t size_to_new = bunch_size * sizeof(Node);
        void *new_mem = ::operator new(size_to_new);
        free_mem_head = static_cast<Node*>(new_mem);

        for (int i = 0; i<bunch_size - 1; i++) {
            free_mem_head[i].next = &free_mem_head[i + 1];
        }
        free_mem_head[bunch_size - 1].next = NULL;

        Node *res = free_mem_head;
        free_mem_head = free_mem_head->next;
    }
    else {
        Node * res = free_mem_head;
        free_mem_head = free_mem_head->next;
        return res;
    }
}

template <int PIECE_SIZE>
void  mempool<PIECE_SIZE>::deallocate(void * node_to_free) {
    Node * p = static_cast<Node*> (node_to_free);
    p->next = free_mem_head;
    p = free_mem_head;
}

我是这样用的:

#include <cstring>

class Test {
public:
    Test(int a, int b) :a(a), b(b) {
        strncpy(c, "abc", 3);
        c[3] = 0;
    }
    int a;
    double b;
    char c[100];
private:
    void *operator new(size_t s1);
    void operator delete(void *);
};

class Node;
mempool<sizeof(Test)> mempool1;
Node * mempool<sizeof(Test)>::free_mem_head = NULL;
void * Test::operator new(size_t s1) {
    return mempool1.allocate();
}

void Test::operator delete(void *p) {
    mempool1.deallocate(p);
    return;
}

编译错误: 错误:专门化成员‘mempool<120>::free_mem_head’需要‘template<>’语法 节点 * mempool::free_mem_head=NULL;

最佳答案

你应该定义没有特殊化的free_mem_head:

template<int PIECE_SIZE>
typename mempool<PIECE_SIZE>::Node * mempool<PIECE_SIZE>::free_mem_head{};

在 C++17 中,它可以在模板本身内部定义:

static inline Node * free_mem_head{};

关于c++ - 在 C++ 中使用模板初始化的静态结构指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52463694/

相关文章:

azure - 如何使用 Azure 资源管理器模板部署 Azure Function(及其代码)?

c - 增长(和收缩)内存池

c - 是否可以在不违反严格别名的情况下使用字符数组作为内存池?

c++ - 更改命名空间中的值

C++ lambda 从 vector 集中删除元素

c++ - 在 LLVM 中,什么 "type"是调用中函数的位转换?如何访问此功能?

c++ - 类型删除 : Retrieving value - type check at compile time

c++ - 可以从文件执行机器代码吗?

c++ - 是否可以回调模板类的成员?

Java - 用于 native /非 native 例程的自定义分配器接口(interface)