gpt4 book ai didi

c++ - 为什么将指针作为 (char *) 传递并转换为 (long *)

转载 作者:搜寻专家 更新时间:2023-10-31 02:05:50 25 4
gpt4 key购买 nike

我知道遗产总是一个理由,但我想从 MariaDB and see if I understand it enough to critique what's going on, 查看这个例子

static int show_open_tables(THD *, SHOW_VAR *var, char *buff) {
var->type = SHOW_LONG;
var->value = buff;
*((long *)buff) = (long)table_cache_manager.cached_tables();
return 0;
}

他们在这里接收 char* 并将其写入 var->value which is also a char* .然后他们在 buff 中强制一个指向 long 的指针,并将类型设置为 SHOW_LONG 以指示它本身。

我想知道为什么他们会为此使用 char* 而不是 uintptr_t -- 特别是当他们强制将指针指向 long 和其中的其他类型时。

uintptr_t 之前的规范不是使用 void* 来实现 C++ 中的多态性吗?

最佳答案

这里好像有两个问题。所以我把我的答案分开了。

使用char*

使用 char* 没问题。 C 和 C++ 标准对字符类型(charsigned charunsigned char)进行了特殊处理。 C 标准定义了以下访问对象的规则:

An object shall have its stored value accessed only by an lvalue expression that has one of the following types:

  • a type compatible with the effective type of the object,
  • a qualified version of a type compatible with the effective type of the object,
  • a type that is the signed or unsigned type corresponding to the effective type of the object,
  • a type that is the signed or unsigned type corresponding to a qualified version of the effective type of the object,
  • an aggregate or union type that includes one of the aforementioned types among its members (including, recursively, a member of a subaggregate or contained union), or
  • a character type.

这实际上意味着字符类型是最接近定义“字节”类型的标准(std::byte 在 C++17 中只是定义为 enum class byte : unsigned字符 {})

但是,根据上述规则,将 char* 转换为 long* 然后分配给它是不正确的(尽管在实践中通常有效)。 memcpy 应该改用。例如:

long cached_tables = table_cache_manager.cached_tables();
memcpy(buf, &cached_tables, sizeof(cached_tables));

void* 也是一个合理的选择。好不好,见仁见智。我会说最明确的选择是为 char 添加类型别名以传达将其用作字节类型的意图(例如 typedef char byte_t)。尽管我想到了几个使用 char 作为字节类型的著名库的例子。例如,Boost 内存映射文件代码给出一个 char* 并且 leveldb 使用 std::string 作为字节缓冲区类型(大概是为了利用 SSO)。

关于uinptr_t:

uintptr_t 是一种可选 类型,定义为能够保存指针的无符号整数。如果要将指向对象的地址存储在整数中,那么它是一个适合使用的类型。它不是适合在这里使用的类型。

关于c++ - 为什么将指针作为 (char *) 传递并转换为 (long *),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51219113/

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