【问题标题】:Type information not passed with new/malloc, only size_t没有用 new/malloc 传递的类型信息,只有 size_t
【发布时间】:2011-01-21 15:26:27
【问题描述】:

已编辑:重新措辞的问题。

调用new和malloc时,传递要分配的内存块大小:

void* malloc(size_t);
void* operator new(size_t);

是否可以获取类型信息,也就是说,您可以执行 sizeof(T) ,其中 T 是分配内存的类型:

T t = new T;

我想重载 new 和 malloc,但需要类型信息而不仅仅是分配的内存大小。

进一步编辑:

我这样做的原因是我会重载malloc。此函数将检查正在分配的内存大小并从特定的内存池中分配:

        template <int v> struct int2type { value = v };

        inline void* malloc(const std::size_t sz)
        {
            if(sz <= 64)
            {
                size_obj* ptr = malloc(nggt::core::int2type<sizeof(size_obj) + (sz % 8)>);
                ptr->sz = sz;
                return ptr+1;
            }
            else if(sz <= 128)
            {
                size_obj* ptr = malloc(nggt::core::int2type<sizeof(size_obj) + 128>);
                ptr->sz = sz;
                return ptr+1;
            }
            else
            {
                return TSuper::malloc(sz);
            }
        }


        inline void* malloc(const nggt::core::int2type<sizeof(size_obj) + 8> sz)
        {
            return m_heap8.malloc(sz.value);
        }

        inline void* malloc(const nggt::core::int2type<sizeof(size_obj) + 16> sz)
        {
            return m_heap16.malloc(sz.value);
        }

还支持使用空闲列表将内存返回到池中的空闲重载。问题是我不能在模板中使用size_t sz,因为它在编译时是未知的。如果我能得到类型信息,我可以做sizeof(T) 并完成!

干杯, 格雷姆

【问题讨论】:

  • “什么叫这些”是什么意思?另请注意,new 确实 not 采用 size_t (它基本上采用任何可转换为整数类型的东西)。
  • 对不起,伙计,我听不懂你的英语。
  • 你需要这个做什么?你有什么目的?
  • 已编辑以包含背景。

标签: c++


【解决方案1】:

带有std::size_t 参数的新参数通常称为非placement newstd::size_t 参数默认传入,让操作系统知道要为您正在创建的对象分配多少字节。您自己不需要将其提供给新声明。

编辑:

响应您的编辑。如果您将 new 运算符重载为

,这是常见的做法
  1. 将其放置在您希望从中调用它的命名空间中
  2. 如果您可以为您的对象制作特定的新闻,请避免使用新的命名空间。 (也就是说,每个类都有特定的行为,为什么不把它放在类本身)
  3. 第一个参数应该是你不需要担心的std::size_t。它将为您处理。

之后的一切都是你的:

struct MyObject{
    MyObject* operator new(std::size_t s, const char* message){
        cout << "Creating an object of size " << size_of(MyObject) << endl;
        return new MyObject();
    }
};

您甚至可以在调用“新”新时使用“旧”新。

进一步编辑:

响应您的下一次编辑,不要调用您自己的 malloc,malloc。相反,将其称为其他名称。如果您正在编写 C++,除非您正在处理一些遗留应用程序,否则 malloc 在您的代码中没有任何位置。在 C++ 中,您应该只接触 new 运算符。

【讨论】:

  • 可能的解决方案,但我想尽可能不将内存分配器绑定到一个类。我想我可以用分配器模板类并说使用 TAllocator... 为帖子添加了另一个编辑。
  • void* new( std::size_t ) 不是新位置,而是new 运算符的签名。这部分语言非常混乱,因为有不同的相关事物具有相同的名称:new。
  • 顺便说一句,placement newnew 表达式 (这是一个调用)的一种形式,其中将额外的参数传递给分配函数,例如作为new (arg) type,它将调用分配器void* new (std::size_t, ArgType)。请注意,区别在于调用者/被调用者。
猜你喜欢
  • 2016-04-21
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 2018-11-21
  • 2023-04-07
  • 1970-01-01
  • 2014-06-11
相关资源
最近更新 更多