【问题标题】:Specific memory allocation - C++ [duplicate]特定的内存分配 - C++ [重复]
【发布时间】:2014-08-12 16:06:27
【问题描述】:

是否可以在特定地址分配内存? 有解决这个问题的功能吗?

【问题讨论】:

  • 什么操作系统,这样做的原因是什么?
  • 您可以使用placement new,但必须是您已经拥有的内存。
  • 如果我使用 new 运算符,我不决定内存地址...
  • 为什么觉得需要在特定地址分配内存?

标签: c++ memory-management


【解决方案1】:

当然。你可以使用一个叫做placement new的东西。

如果您的目标是 RAM 非常小的移动平台,或者当您正在编写内存池时,它会很有用。

请注意,除非您的可执行文件具有特殊权限(例如内核扩展),否则您必须拥有要分配的内存。

一个(无用的)例子:

// Assuming you can access and read/write at 0x1234ABCD
unsigned char* ptr = reinterpret_cast<unsigned char*>(0x1234ABCD);
// Allocate a std::string at ptr
std::string* foo = new(ptr) std::string;

【讨论】:

    【解决方案2】:

    要在特定地址分配,您需要使用特定于操作系统的 API。但是,如果您有分配的空间和地址,您可以使用 new withplacement 运算符在分配的空间内的地址处构造对象。分配的空间也可以来自对 char 数组上的 new 的调用,或者类似的简单的东西。

    【讨论】:

    • 一些平台,例如嵌入式系统,可以在没有 RTOS 的情况下分配内存,因为很多平台不使用 OS。
    【解决方案3】:

    我只知道在 Linux 下可以做到这一点,你需要使用 mmap 调用,它允许你请求一个特定的地址:

    void *foo = (void *)0xDEADBEEF;
    size_t MyLength = 1024;
    void *bar = mmap(foo, MyLength
        , PROT_READ | PROT_WRITE | MAP_ANONYMOUS | MAP_FIXED, MAP_PRIVATE, -1, 0);
    

    请注意,如果地址已被使用或不是页面大小的倍数(512 或 4k 字节),这将失败

    【讨论】:

      猜你喜欢
      • 2012-12-23
      • 2011-06-23
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      相关资源
      最近更新 更多