相关疑难解决方法(0)

64位Windows上的长位是多少?

不久前,有人告诉我long在64位机器上不是64位,我应该总是使用int.这对我来说没有意义.我已经看到docs(例如Apple官方网站上的文件)说long在编译64位CPU时确实是64位.我查了64位Windows上的内容并找到了

  • Windows:longint保持32位长度,并为64位整数定义特殊的新数据类型.

(来自http://www.intel.com/cd/ids/developer/asmo-na/eng/197664.htm?page=2)

我该怎么用?我应该定义类似uw,sw((UN)签署的宽度)为long如果没有在Windows,否则做对目标CPU bitsize支票?

c c++ windows 64-bit porting

134
推荐指数
5
解决办法
17万
查看次数

C++ 中所有指针的大小都相同吗?

最近,我看到这样的说法

所有指针具有相同的大小是很常见的,但从技术上讲,指针类型具有不同的大小是可能的

但后来我发现了这样的内容:

虽然指针的大小都是相同的,因为它们只存储内存地址,但我们必须知道它们指向什么类型的东西。

现在,我不确定以上哪种说法是正确的。第二个引用的语句看起来像是来自佛罗里达州立大学计算机科学的 C++ 笔记。


这就是为什么在我看来所有指针都应该具有相同的大小:

1)假设我们有:

int i = 0;
void* ptr = &i; 
Run Code Online (Sandbox Code Playgroud)

现在,假设 C++ 标准允许指针具有不同的大小。进一步假设在某些任意机器/编译器上(因为标准允许),a 的void*大小为 2 字节,而 a 的int*大小为 4 字节。

现在,我认为这里有一个问题,即右侧有一个int*大小为 4 字节的 ,而左侧有一个void*大小为 2 字节的 。int*因此,当从到发生隐式转换时,void*将会丢失一些信息

2)所有指针都保存地址。由于对于给定的机器,所有地址都具有相同的大小,因此所有指针也应该具有相同的大小是非常自然(合乎逻辑的)。

因此,我认为第二句话是正确的。


我的第一个问题是 C++ 标准对此有何规定?

我的第二个问题是,如果 C++ 标准确实允许指针具有不同的大小,那么有理由吗?我的意思是允许指针具有不同的大小对我来说似乎有点不自然(考虑到我上面解释的两点)。所以,我很确定标准委员会一定已经考虑到了这一点(指针可以有不同的大小),并且已经有理由允许指针有不同的大小。请注意,只有当标准确实允许指针具有不同的大小时,我才会问这个(第二个问题)。

c++ pointers void-pointers language-lawyer pointer-conversion

56
推荐指数
5
解决办法
8669
查看次数

指针(地址)可以是负数吗?

我有一个函数,我希望能够返回失败未初始化的特殊值(它返回成功指针).

目前它为失败返回NULL,为未初始化返回-1,这似乎有效......但我可能会欺骗系统.iirc,地址总是积极的,不是吗?(虽然由于编译器允许我将地址设置为-1,这看起来很奇怪).

[更新] 我有另一个想法(如果-1是有风险的)是malloc一个char @全局范围,并使用该地址作为哨兵.

c signed pointers return-value

35
推荐指数
4
解决办法
2万
查看次数

通过值与引用或指针传递的性能成本?

让我们考虑一个对象foo(可能是一个int,一个double,一个习惯struct,一个class,等等).我的理解是,通过foo引用函数(或只是传递指针foo)来传递更高的性能,因为我们避免制作本地副本(如果foo很大则可能很昂贵).

但是,从这里的答案来看,似乎64位系统上的指针实际上可以预期大小为8字节,无论指向什么.在我的系统上,a float是4个字节.这是否意味着如果foo是类型float,那么仅通过值传递而不是给它指向它是更有效的foo(假设没有其他约束可以使得使用一个比函数内的另一个更有效)?

c++ pointers pass-by-reference pass-by-value pass-by-pointer

26
推荐指数
4
解决办法
2万
查看次数

c:空隙大小*

我对C中的void*指针有点困惑.特别是在读完这个问题后:sizeof(某些指针)是否总是等于4?,一个人说没有保证sizeof(int*)== sizeof(double*)

我的问题是:是否有sizeof(void*)> = sizeof(任何其他指针类型)的保证?换句话说,我是否可以始终为void*指针指定some_type*指针,然后将其作为some_type*返回?

c void-pointers

23
推荐指数
2
解决办法
3万
查看次数

为什么在Windows x64上IntPtr.size为4?

我想当我使用IntPtr.Size时我应该得到8.但是我仍然使用Widnows 7 x64在x64机器上获得4个,为什么?

c# pinvoke

18
推荐指数
3
解决办法
1万
查看次数

指针的大小和体系结构

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

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

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

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

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

c c++ assembly portability

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

在C中初始化循环数据.这个有效的C代码是否符合任何标准?

我想看看我是否可以初始化一个全局变量来指向自己:

#include <stdio.h>
struct foo { struct foo *a, *b; } x = { &x, &x };
int main()
{
    printf("&x = %p, x.a = %p, x.b = %p\n", &x, x.a, x.b);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此代码编译并按预期运行gcc(所有三个指针打印相同).

我想知道:

  1. 这可靠吗?
  2. 这是标准吗?
  3. 这是便携式吗?

编辑:只是为了澄清,我质疑x其自己的初始化程序中的地址的可用性.

c gcc recursive-datastructures circular-reference static-initialization

16
推荐指数
2
解决办法
302
查看次数

指针可以有不同的大小吗?

这个答案附带了一个有趣的声明 - "在int*小于a的机器上char*".(让我们排除指向函数的指针)

指向不同类型的指针是否有可能具有不同的大小?为什么这会有用?

c++ pointers language-lawyer

16
推荐指数
3
解决办法
844
查看次数

指针占用了多少字节?

我对指针和它们占用的字节有点困惑.在我的教科书中,它首先说明16位系统上的指针占用2个字节,32位系统占用4个字节,64位系统占用8个字节,依此类推.然后是10行,它表示指针占用了许多字节,这是保存地址所需的.这是我的问题:

  1. 那么这是否意味着如果我们在64位系统上说,地址最多需要8个字节?
  2. 如果我们在16位系统上,指针占用2个字节,并且地址需要更多2个字节,那么会发生什么?

c pointers

13
推荐指数
3
解决办法
4万
查看次数