在预分配的内存中移动数据

时间:2017-07-18 11:45:26

标签: c++

我一直在尝试为预先分配的内存实现碎片整理程序。假设我们有<!DOCTYPE html> <html lang="en"> <head> <title>Bootstrap Example</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script> </head> <body> <div class="container"> <div class=" popr form-group" data-id="1"> <a href="#" data-placement="bottom" title="Bill Category"><input class="form-control input-sm" id="messageTextBox" type="text" placeholder="Select category"> </a> </div> <!-- loaded popover content --> <div id="popover-section selectBox"> <div class="selectBox" class="popr-box" data-box-id="1"> <div id="title-pop" class=" popr-item">Bill category </div> <a href="#" title="Menu" data-toggle="popover" data-content="Menu Item 1" data-trigger="hover"><div class="popr-item">Menu Item 1</div></a> <a href="#" title="Menu" data-toggle="popover" data-content="Menu Item 2" data-trigger="hover"><div class="popr-item">Menu Item 2</div></a> <a href="#" title="Menu" data-toggle="popover" data-content="Menu Item 3" data-trigger="hover"><div class="popr-item">Menu Item 3</div></a> </div> </div> </div> <script> $(document).ready(function() { $('[data-toggle="popover"]').popover(); $('[data-toggle="popover"]').on("click",function(){ $("#messageTextBox").val($(this).find("div").text()); }); }); </script> </body> </html>的预分配内存的void指针:

sizeof(int) * 3

初始化第一和第三块内存

void* ptr = operator new(sizeof(int) * 3);

以下是我的问题:是否可以在不知道值类型的情况下将值从int *one = new (ptr) int(1); int *three = new (ptr + sizeof(int) * 2) int(3); (* 3)转移到第二(ptr + sizeof(int) * 2)位置?

(ptr + sizeof(int))不是一种选择。

2 个答案:

答案 0 :(得分:3)

没有。您必须知道void*已删除的类型的大小。如果您无法恢复类型(int),或者更确切地说类型占用的字节数(sizeof(int)),则无法可靠地操作底层内存。

答案 1 :(得分:0)

是的,您需要知道并保留存储类型的大小。更重要的是,存储类型必须为trivial,至少为trivially copyable。否则,存储的对象可能会非常惊讶地发现自己在内存中移动。如果您需要支持此类非平凡类型,则必须使用其真实副本或移动构造函数或赋值运算符。