gpt4 book ai didi

c++ - `u8string_view` 到 `char` 数组而不违反严格别名?

转载 作者:行者123 更新时间:2023-12-01 12:32:56 26 4
gpt4 key购买 nike

前提

  • 我在内存中有一个二进制数据块,表示为 char* (可能从文件中读取,或通过网络传输)。
  • 我知道它在某个偏移量处包含一个特定长度的 UTF8 编码文本字段。


  • 我如何(安全且便携地)获得 u8string_view来表示这个文本字段的内容?
    动机
    将该字段作为 u8string_view 传递给下游代码的动机是:
  • 它非常清楚地表明文本字段是 UTF8 编码的,与 string_view 不同。 .
  • 它避免了将其返回为 u8string 的成本(可能是免费存储分配 + 复制) .

  • 我试过的
    这样做的天真方法是:
    char* data = ...;
    size_t field_offset = ...;
    size_t field_length = ...;

    char8_t* field_ptr = reinterpret_cast<char8_t*>(data + field_offset);
    u8string_view field(field_ptr, field_length);
    但是,如果我正确理解了 C++ 严格别名规则,这是未定义的行为,因为它访问了 char* 的内容。通过 char8_t* 缓冲 reinterpret_cast 返回的指针, 和 char8_t不是别名类型。
    真的吗?
    有没有办法安全地做到这一点?

    最佳答案

    当您访问具有没有 acceptable type 的泛左值的对象时,会发生严格的别名规则。 .
    首先考虑一个定义明确的案例:

    char* data = reinterpret_cast <char *> (new char8_t[10]{})
    size_t field_offset = 0;
    size_t field_length = 10;
    char8_t* field_ptr = reinterpret_cast<char8_t*>(data + field_offset);
    u8string_view field(field_ptr, field_length);
    field [0]+field[1];
    这里没有UB。您创建了一个数组 char8_t然后访问数组的元素。
    现在如果对象是 data 引用的内存会发生什么?是由另一个程序创建的?根据标准,这是 UB,因为该对象不是由 specified way to create it 之一创建的。 .
    但是,标准尚不支持您的代码这一事实在这里不是问题。所有编译器都支持此代码。如果不是,则没有任何效果,您甚至无法进行最简单的系统调用,因为程序与任何内核之间的大部分通信都是通过字符数组进行的。因此,只要在您的程序内部,您就可以访问 data+field_offset 之间的内存。和 data+field_offset+field_length通过 char8_t 类型的泛左值您的代码将按预期工作。

    关于c++ - `u8string_view` 到 `char` 数组而不违反严格别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63364438/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com