c++ - 将 4 字节整数写入 char* 数组
问题描述
我有QByteArray
一个给定大小的。访问数组的原始数据返回char*
,基本上是一个字符数组。
我想用一个值填充QByteArray
整个尺寸。uint32_t
最安全、最有效的方法是什么?我知道我可以使用 Qt 函数将数据附加到一个空的 QByteArray 中,但是它会重新分配内存很多时间。
我想到了以下实现,但我不确定它是否是最好的解决方案:
auto data = QByteArray(fillSize, '0');
auto dataPtr = data.data();
auto fillValue = _byteswap_ulong(getFillValue());
for (char* it = dataPtr; it != dataPtr + fillSize; it += 4)
{
auto help = reinterpret_cast<uint32_t*>(it);
*help = fillValue;
}
解决方案
像访问char
数组一样访问数组int
违反了严格的别名规则。
除此之外,您的数组可能未对齐int
. 未对齐的访问是一个主要问题,因为某些处理器根本无法做到这一点,而其他处理器则可以做到,但速度很慢。这也是未定义的行为。
这是一个没有任何对齐问题或严格混叠问题的版本:
#include <stddef.h> // for size_t
#include <stdint.h> // for int32_t
#include <string.h> // for memcpy
void Fill(char* const arr, size_t const size, int32_t const value) noexcept {
for (size_t i = 0; i + sizeof(value) <= size; i += sizeof(value))
memcpy(arr + i, &value, sizeof(value));
}
另请注意,如果您计划存储此数据或通过网络发送数据,CPU 的字节顺序将很重要。
推荐阅读
- java-money - Java 的货币和货币操作 - JSR 354
- kubernetes - Kubernetes pod 对集群或命名空间级别的限制
- amazon-web-services - 在不遵循终止策略的情况下,您能否指定在通过自动扩展组缩减 EC2 实例时要终止的实例?
- sed - 使用 sed 使用环境变量替换复杂行
- ruby-on-rails - 为什么我的 Rails DB 迁移没有创建列?
- javascript - Js/jQuery - 此代码将大小设置为变量,有什么方法可以使其响应?
- javascript - NPM 损坏并报告此错误:npm ERR!404
- salt-stack - 使用 Salt 安全交付 Minion 特定文件的最佳方法是什么?
- wordpress - 两个 WordPress 实例随机生成,状态为 301
- outlook - 关于 PidTagInternetCodePage、PidTagMessageCodepage、PidTagStoreSupportMask 的 MSG 说明