簡體   English   中英

將字符數組轉換為C ++中的POD數組

[英]casting char-array into array of PODs in C++

編寫下面代碼的正確方法是什么?

我有一個為我提供char *的內存管理器,但是我需要使用uint32_t數組。 如何解決嚴格的別名規則? 我了解到,建議僅使用一個對象使用memcpy()復制內容,但該解決方案對於對象數組不可接受。

char* ptr = manager()->Allocate(1000 * sizeof(uint32_));
uint32_t* u32ptr = reinterpret_cast<uint32_t*>(ptr);
....
u32ptr[x] = y;

您可以使用新的展示位置:

uint32_t* u32ptr = new(ptr) uint32_t[1000];

請注意,此后,存儲的有效類型為int32_t ,您可能不再使用ptr了。 您不必對char進行任何特殊處理,因為對於帶有瑣碎析構函數的類型,您可以簡單地通過重用存儲來結束它們的生命。

您可以使Manager類返回std::unique_ptr<void, Manager::Deleter> (即,使用帶有自定義刪除器唯一指針 )。 當您超出范圍時,這將使分配使用RAII自動取消分配。 並且不使用指針,而是使用gsl::span在這種情況下,您可以編寫:

constexpr const length = 1000;
auto allocated = manager()->Allocate(
    length * sizeof(std::uint32_t), 
    alignof(uint32_t) // supporting alignment here is important, otherwise
                      // you'll have to manually take care of that yourself
);
auto p = gsl::span<uint32_t>(new(allocated.get()) std::uint32_t[length], length);

另一種方法是到模板Manager類,或分配方法,在一個元素類型,並把照顧的事情:

auto p = manager()->Allocate<std::uint32_t>(1000);

...和p將是構造的uint32_tstd::unique_ptr<uint32_t> 並不是說您需要對其進行任何構造,但是仍然如此。

注意:在這兩種情況下, 都不能從所在的作用域中返回p ,因為它是一個非所有者指針,並且在離開作用域時將釋放內存。 p僅用於本地工作。 如果要使內存不在范圍之內,則必須返回unique_ptr

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM