相关疑难解决方法(0)

sizeof(某些指针)总是等于4吗?

例如: sizeof(char*)返回4一样int*,long long*,我已经竭尽所能.这有什么例外吗?

c c++ memory pointers sizeof

217
推荐指数
8
解决办法
11万
查看次数

为什么指向函数的指针大小与指向成员函数的指针大小不同?

指针只是一个地址吗?或者我错过了什么?

我测试了几种类型的指针:

  • 指向任何变量的指针是相同的(我平台上的8B)
  • 指向函数的指针大小相同,作为指向变量的指针(8B再次)
  • 指向具有不同参数的函数的指针 - 仍然相同(8B)

但是指向成员函数的指针更大 - 我的平台上有16B.

三件事:

  1. 为什么指向成员函数的指针更大?他们需要更多信息?
  2. 据我所知,标准只字未提指针的大小,除了void*必须能够"包含"任何指针类型.换句话说,任何指针必须能够被转换为void*,对吧?如果是这样,那么为什么sizeof( void* )是8,而sizeof指向成员函数的指针是16?
  3. 是否还有其他指针示例,它们具有不同的大小(我的意思是,对于标准平台,不是一些稀有和特殊的平台)?

c++ pointers member-function-pointers function-pointers

28
推荐指数
2
解决办法
6831
查看次数

为什么必须在向前声明时提供枚举的大小?

我只是不明白为什么枚举的大小与编译器相关,而类的大小不是.

我的代码示例:

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让它编译并正常工作.所以问题是:

为什么这还没有标准化?

c++ enums forward-declaration c++11

20
推荐指数
2
解决办法
1057
查看次数

指针的大小和体系结构

通过在普通台式PC上运行简单的C ++程序进行基本测试,似乎可以假设任何类型的指针(包括函数指针)的大小等于目标体系结构位的大小。

例如:在32位体系结构中-> 4个字节,在64位体系结构中-> 8个字节。

但是我记得读过的话,它不是一般的那样!

所以我想知道这种情况会怎样?

  • 为了使指向数据类型的指针的大小与指向其他数据类型的指针的大小相等
  • 为了使指向数据类型的指针的大小与指向函数的指针的大小相等
  • 为了使指向目标体系结构的指针大小相等

c c++ assembly portability

17
推荐指数
6
解决办法
2140
查看次数

在平台ABI中键入规范

可以安全地假设在任何实际可用的平台ABI中定义了哪些项目?

  1. 的价值 CHAR_BIT

  2. 尺寸,对齐要求和对象表示:

    1. void*,size_t,ptrdiff_t
    2. unsigned charsigned char
    3. intptr_tuintptr_t
    4. float,doublelong double
    5. shortlong long
    6. intlong(但在这里,我希望"不")
    7. 指向平台ABI为其指定这些属性的对象类型的指针
    8. 指向函数的指针,其类型仅涉及平台ABI指定这些属性的类型
  3. 空对象指针的对象表示

  4. 空函数指针的对象表示

例如,如果我有一个库(由未知但符合ABI的编译器编译)发布此函数:

void* foo(void *bar, size_t baz, void* (*qux)());
Run Code Online (Sandbox Code Playgroud)

我可以假设能够在我的程序中安全地调用它,无论我使用哪个编译器?

或者,反过来说,如果我正在编写一个库,是否有一组类型,如果我将库的公共接口限制为此集,它将保证在它构建的所有平台上都可用?

c platform abi

7
推荐指数
1
解决办法
216
查看次数

在原始类型指针之间进行转换

以下是明确定义的:

char* charPtr = new char[42];
int* intPtr = (int*)charPtr;

charPtr++;
intPtr = (int*) charPtr;
Run Code Online (Sandbox Code Playgroud)

intPtr(在这两种情况至少之一)没有正确对齐.只是把它放在那里是非法的吗?是UB在任何阶段使用它吗?你怎么能用它,怎么不能?

c++ strict-aliasing language-lawyer

5
推荐指数
1
解决办法
794
查看次数

C 中的指针及其大小

我已经尝试解决这个问题有一段时间了,并搜索了相关问题。我找到了一些有意义的答案,但显然我需要这个刻在石头上的答案。

目前我正在学习产品的一些固件。一组指针已初始化为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:我无法分享整个代码,因为它是一个实际的产品,但会按照以下方式进行。如果这还不够,我将不得不研究一个具体的例子。

代码

从代码中分配大小的变量

c

0
推荐指数
1
解决办法
189
查看次数