【发布时间】:2018-07-07 00:59:33
【问题描述】:
我知道遗产总是一个理由,但我想看看这个来自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 之前的规范不是在 C++ 中使用 void* 进行多态性吗?
【问题讨论】:
-
您需要研究
show_open_tables()是如何在更广泛的代码库中实际使用的。我看到它被存储在一个查找表中,其中包含使用除long之外的其他数据类型的其他函数。很明显,char*参数的使用是要求函数具有统一签名的较大 API 的一部分。在这种情况下,使用void*而不是char*可能更有意义 -
是否有任何理由将指针存储为
char*而不是void*,这对于uintptr_t来说是一个理想的情况,C++11 是 "MySQL 8.0源代码允许使用 C++11 功能。"? -
文件包含最低级别的字节。最接近的 C++ 类型是
char。记忆也是如此。 -
强制转换为
long*可能是因为缓冲区在开始时具有已知的内存布局,其中包含long值。 -
干得好,这是一个静态的。我不希望任何人在公共场合看到我的脏床单。
标签: c++ mysql pointers polymorphism void-pointers