例如:
sizeof(char*)返回4一样int*,long long*,我已经竭尽所能.这有什么例外吗?
指针只是一个地址吗?或者我错过了什么?
我测试了几种类型的指针:
但是指向成员函数的指针更大 - 我的平台上有16B.
三件事:
void*必须能够"包含"任何指针类型.换句话说,任何指针必须能够被转换为void*,对吧?如果是这样,那么为什么sizeof( void* )是8,而sizeof指向成员函数的指针是16?我只是不明白为什么枚举的大小与编译器相关,而类的大小不是.
我的代码示例:
class A;
enum E; // must be enum E : int; in order to compile
void f(const A & param);
void f(const E & param);
Run Code Online (Sandbox Code Playgroud)
我在这里谈论标准C++编译器.我知道MSVC让它编译并正常工作.所以问题是:
为什么这还没有标准化?
通过在普通台式PC上运行简单的C ++程序进行基本测试,似乎可以假设任何类型的指针(包括函数指针)的大小等于目标体系结构位的大小。
例如:在32位体系结构中-> 4个字节,在64位体系结构中-> 8个字节。
但是我记得读过的话,它不是一般的那样!
所以我想知道这种情况会怎样?
可以安全地假设在任何实际可用的平台ABI中定义了哪些项目?
的价值 CHAR_BIT
尺寸,对齐要求和对象表示:
void*,size_t,ptrdiff_tunsigned char 和 signed charintptr_t 和 uintptr_tfloat,double和long doubleshort 和 long longint和long(但在这里,我希望"不")空对象指针的对象表示
空函数指针的对象表示
例如,如果我有一个库(由未知但符合ABI的编译器编译)发布此函数:
void* foo(void *bar, size_t baz, void* (*qux)());
Run Code Online (Sandbox Code Playgroud)
我可以假设能够在我的程序中安全地调用它,无论我使用哪个编译器?
或者,反过来说,如果我正在编写一个库,是否有一组类型,如果我将库的公共接口限制为此集,它将保证在它构建的所有平台上都可用?
以下是明确定义的:
char* charPtr = new char[42];
int* intPtr = (int*)charPtr;
charPtr++;
intPtr = (int*) charPtr;
Run Code Online (Sandbox Code Playgroud)
将intPtr(在这两种情况至少之一)没有正确对齐.只是把它放在那里是非法的吗?是UB在任何阶段使用它吗?你怎么能用它,怎么不能?
我已经尝试解决这个问题有一段时间了,并搜索了相关问题。我找到了一些有意义的答案,但显然我需要这个刻在石头上的答案。
目前我正在学习产品的一些固件。一组指针已初始化为uint8_t,如下例所示:
uint8_t *pwhatevs;
Run Code Online (Sandbox Code Playgroud)
上面sizeof将返回1(一个字节)。当稍后在固件中分配该指针时,它将通过以下方式指向 32 位地址:
pwhatevs = (uint8_t *)&whatever;
Run Code Online (Sandbox Code Playgroud)
这种语法对我来说似乎很奇怪。初始部分(uint8_t *)是 8 位指针类型转换。但如果我采取sizeof pwhatevsnow 它会返回4(4 个字节),我对此并不感到惊讶,但由于指针类型转换,我再次感到非常惊讶。有人可以解释一下吗?如果需要更多信息,我会尽可能提供!
编辑:在另一个与指针大小相关的问题中,提到指针的大小取决于系统,例如 16、32 或 64 位。这确实有道理,但是为什么*pwhatevs初始化时的大小不是 4 个字节呢?
编辑2:我无法分享整个代码,因为它是一个实际的产品,但会按照以下方式进行。如果这还不够,我将不得不研究一个具体的例子。

