簡體   English   中英

如何將int復制到char的boost / std :: array?

[英]How to copy an int to a boost/std::array of char?

為什么將int復制到boost / std :: array最簡單,最有效?

以下似乎有效,但是我不確定這是否是最合適的方法:

  int r = rand();
  boost::array<char, sizeof(int)> send_buf;
  std::copy(reinterpret_cast<char*>(&r), reinterpret_cast<char*>(&r + sizeof(int)), &send_buf[0]);

只是為了比較,這與memcpy相同:

#include <cstring>

int r = rand();
boost::array<char, sizeof(int)> send_buf;
std::memcpy(&send_buf[0], &r, sizeof(int));

您的電話是否比使用C中也存在的函數的C ++“罪過”(是否有大量的類型轉換(以及將它們弄錯的機會)好還是壞)有關?

我個人認為memcpy對於這種操作是一個很好的“警報”,原因同C ++樣式轉換是一個很好的“警報”(在閱讀時易於發現,易於搜索)相同。 但是您可能希望對所有內容都使用相同的警報,在這種情況下,可以將memcpy的參數memcpyvoid*

順便說一句,我可能對兩個大小都使用sizeof r ,而不是sizeof(int) ,但是它取決於上下文是否要求數組“對於r足夠大(恰好是一個int)”還是“大小相同”。作為一個int(r恰好是)”。 由於它是一個發送緩沖區,所以我猜該緩沖區是有線協議要求的大小,並且r應該與該緩沖區匹配,而不是相反。 所以sizeof(int)可能合適,但4PROTOCOL_INTEGER_SIZE可能更合適。

這個想法是正確的,但是您有一個錯誤:

reinterpret_cast<char*>(&r + sizeof(int))

應該:

reinterpret_cast<char*>(&r) + sizeof(int)

要么

reinterpret_cast<char*>(&r+1)

這些或等效的memcpy都可以。 還有其他可能會導致對齊問題。

為達到這些目的而使用reinterpret_cast是常見的貨幣,但標准明確指出,通過void* static_cast是完全可以接受的。 實際上,在類型為int的情況下,則將reinterpret_cast<char*>(&r) 定義為具有static_cast<char*>(static_cast<void*>(&r))的語義。 為什么不露骨而直接使用呢?

如果您養成了習慣,那么將來使用reinterpret_cast機會就更少了,后者最終將具有實現定義的語義,而不是始終具有明確定義的語義的static_cast鏈。

請注意,您被允許將指向單個對象的指針視為指向一個對象的指針(參見5.7 / 4)。 這對於獲得第二指針很方便。

int r = rand();
boost::array<char, sizeof(int)> send_buf;
auto cast = [](int* p) { return static_cast<char*>(static_cast<void*>(p)); };
std::copy(cast(&r), cast(&r + 1), &send_buf[0]);

邁克爾·安德森(Michael Anderson)指出的小錯誤

但是您可以這樣做:

#include <iostream>

union U
{
    int  intVal;
    char charVal[sizeof(int)];
};

int main()
{
    U   val;
    val.intVal  = 6;

    std::cout <<  (int)val.charVal[0] << ":" << (int)val.charVal[1] << ":" << (int)val.charVal[2] << ":" << (int)val.charVal[3] << "\n";
}

暫無
暫無

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

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