gpt4 book ai didi

c++ - 获取单个元素的大小或使用 operator new[] 分配的元素计数

转载 作者:太空狗 更新时间:2023-10-29 21:25:24 26 4
gpt4 key购买 nike

有没有办法获取单个元素的大小或使用 operator new[] 分配的元素数量?

我的意思是:

void* Object::operator new[](size_t size)
{
void *temp = ::operator new(size);

//Get size of single element or count of elements being allocated

return temp;
}

为什么我需要它:

operator new(size_t)operator new[](size_t) 只有在堆上分配对象时才会被调用,所以我有了创建 C++ 垃圾的想法以此为基础收集。

  1. 所有对象都继承自 Object
  2. Object 类覆盖 operator new(size_t)operator new[](size_t),如下所示:

    void* Object::operator new(size_t size)
    {
    Object& result = *static_cast<Object*>(::operator new(size));
    result.referenceCount = (int)&result;
    return &result;
    }
  3. Object 的构造函数使用此信息:

    Object::Object()
    {
    if ((void*)referenceCount != this)
    {
    referenceCount = -1; //stack object no reference counting
    }
    else
    {
    referenceCount = 1; //heap object count references
    }
    }
  4. 要使用的垃圾收集器用户 referenceCount 字段。

我现在需要的是实现 operator new[](size_t) 来设置 referenceCount,这就是为什么我需要单个元素的大小或元素计数。为每个问题之外的对象实现 operator new[](size_t)

有什么想法吗?

最佳答案

我觉得这很像 Java。简单地用 Java 编写程序会更简单吗?如果您从一开始就使用惯用的 C++,那么将来需要维护您的 C++ 代码的任何人都会很感激。例如,使用智能指针来管理您的内存,而不是尝试根据继承自 Object 的所有内容来实现垃圾回收。

我应该指出,您从条件列表中遗漏了“禁止多重继承”,因为在存在多重继承的情况下,您可能无法将原始的、未初始化的内存转换为 Object*访问 referenceCount 的正确地址所需的指针调整。

此外,如果 referenceCount 的内存恰好在构造时保存了基于堆栈的 Object 的地址,您的代码将认为它是堆分配的,并最终导致删除堆栈指针时的 UB。

但毕竟,如果您仍然真的真的很想这样做,我认为您唯一的选择是使用 CRTP 自动将数组 new 运算符注入(inject)每个子类。至少这样你就不必为每个 child 都自己写。

关于c++ - 获取单个元素的大小或使用 operator new[] 分配的元素计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14075046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com