【问题标题】:Optimal way to convert an int into a char array将 int 转换为 char 数组的最佳方法
【发布时间】:2013-10-30 03:11:23
【问题描述】:

int 放入char 数组的最佳方法(性能)是什么? 这是我当前的代码:

data[0] = length & 0xff;
data[1] = (length >> 8)  & 0xff;
data[2] = (length >> 16) & 0xff;
data[3] = (length >> 24) & 0xff;

datachar 数组(共享指针),lengthint

【问题讨论】:

  • 这是最好的方法。据我所知。 :)
  • 联合可以提供相同的功能,但要注意字节顺序:cplusplus.com/doc/tutorial/other_data_types
  • @LightnessRacesinOrbit 最低的执行时间和 CPU 使用率。
  • @Aybe:实际上,不,以这种方式使用 union 会产生 UB。使用union 进行转换是错误的。
  • @KacperFałat:这只是“最佳”。您不能“更多”或“更少”或“最少”或“最”最佳;)

标签: c++ arrays type-conversion


【解决方案1】:

你在找memcpy吗

char x[20];
int a;
memcpy(&a,x,sizeof(int));

您的解决方案也很好,因为它是 endian safe

附带说明:-

虽然没有这样的保证 sizeof(int)==4 对于任何特定的实现。

【讨论】:

  • memcpy endian 安全吗?
  • @KacperFałat:- 是的,因为它将 num 字节的值从源指向的位置直接复制到目标指向的内存块。
  • 我还有一个问题,因为我读到该方法比手动复制要快,所以是否可以选择使用 memcpy 之类的函数返回表单 char 数组 int ?有函数用我的旧 API 返回,return (unsigned int)(data[0]&0xff) | ((数据[1]&0xff)
  • @KacperFałat:- 我建议您将此作为另一个问题提出,因为这将帮助您获得一些好的答案! :)
【解决方案2】:

只需使用reinterpret_cast。像使用 int 指针一样使用数据数组。

    char data[sizeof(int)];
    *reinterpret_cast<int*>(data) = length;

BTW memcpy 比这慢得多,因为它使用循环逐字节复制。
在整数的情况下,这只是一个简单的赋值。

【讨论】:

  • 数据的值多于 4。
  • 好吧。这在 sizeof(int) &gt; 4 的平台上失败。你应该确保它不是。当然 OP 的代码也是如此。
  • @YochaiTimmer 将 4 更改为 sizeof(int) 然后!
  • 应该是alignas(int) char data[sizeof(int)]
  • 这打破了严格的别名规则,因此有 UB。
【解决方案3】:

这是唯一的方法。理论上你可以使用memcpyreinterpret_cast,但你不能因为endians 的问题。

【讨论】:

  • 理论上和实际。只要可以确保字节顺序,强制转换/复制方式是绝对安全的(它可以在许多应用程序中,但不是全部)。
  • 但是在大​​多数平台上更改字节序的需要在这种情况下不会提高性能。
  • 这仅在您将数据发送到另一台机器时才相关。只要它保持在同一台机器上,它就是安全有效的。对于许多事情来说,这完全足够了。声称不能使用这种方式是不准确的。
  • 那些该死的字节序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
相关资源
最近更新 更多