【问题标题】:Is Variable size in C compiler dependent?C编译器中的可变大小是否依赖?
【发布时间】:2018-09-04 10:22:50
【问题描述】:

考虑以下代码:

void print(int arr[])
{
  int n = sizeof(arr)/sizeof(arr[0]);
  printf("\nSize is  %d",n);
}

int main()
{
    int arr[]={1,2,3,4,5,6};
    print(arr);
    return 0;
}
  • 当上述代码在 GCC 6.3 或更低版本中编译时,输出为: size is 2
  • 在MinGW编译器中编译代码时,输​​出为Size is 1

现在相反,我们曾经研究过,当数组作为参数传递时,它只传递数组的基地址(对于隐式指针变量和整数变量都是 4 个字节 em>)。

变量大小是否依赖于编译器,或者我在这里遗漏了什么?请纠正我

【问题讨论】:

  • arr[] 是一个点。 sizeof(arr)/sizeof(arr[0]); 是指针的大小/int 的大小。不涉及数组。
  • 在 C 中的实践中,每个接受数组的函数都应该被赋予该数组的大小,通常通过其他一些参数
  • int 的大小取决于编译器,但编译器理论上可能会根据目标平台、CPU 或编译器开关进行更改。

标签: c gcc parameters mingw


【解决方案1】:

arr[],作为函数参数,是一个指针。 sizeof(arr)/sizeof(arr[0]); 是指针的大小/int 的大小。不涉及数组。

C 编译器中的可变大小是否依赖于?

是的,int 可以是 32 位、16 位等。1(必须至少为 16)

对象指针可以是 16 位、32 位、64 位等。1(必须至少为 16)

指针通常比int 宽,但可能相同或(很少)更小。该比率可以是 2/1 或 1/1 或其他。


1 其他大小也是可能的,并且已被采用,例如 36 位 int 或 48 位对象指针。这是 C 能够采用的几乎任何已构建的处理器,并且可能适用于所有新处理器。灵活性的代价是可移植代码必须考虑这些变化。

【讨论】:

  • 上面提到的问题是在一个遵循GCC 6.3的代码竞赛平台上。所以,我认为最好预先假设类似的平台将遵循 2:1 的比例?
  • @mustangDC 一个合理的assumption,尽管健壮的代码不依赖于 2:1 的比例。
【解决方案2】:

是的,类型的大小取决于实现。特别是,指向int 的指针的大小和int 的大小取决于C 实现(主要是编译器),并且可能彼此不同。

“数组的基址(对于隐式指针变量和整数变量都是 4 个字节)”中包含的问题中的断言通常是错误的。在某些 C 实现中是正确的,但在其他实现中是错误的。

void print(int arr[]) 声明的函数内的代码sizeof(arr)/sizeof(arr[0]) 打印指向int 的指针的大小除以int 的大小。

虽然 C 实现受其所针对的体系结构和操作系统的影响很大,但它们可能会出于执行速度以外的原因选择其类型的大小,例如支持更小的内存使用的目标、支持未写入的代码完全可移植到任何类型大小,或支持更轻松地使用大整数。

【讨论】:

    【解决方案3】:

    Are the variable sizes compiler dependent ? 是的,它取决于编译器,但这并不意味着架构观点是无关紧要的。此外,它取决于架构是否是 16/32/64 位系统,例如,在 16-bit 机器中,sizeof (int)2 字节,在 32-bit 机器中它是 4 字节。

    int 被认为是处理器的本机大小,即寄存器的大小。

    这里的函数参数arr[]是一个指针而不是一个数组。

    所以如果系统是32位系统那么

    sizeof(arr)/sizeof(arr[0]);

    将导致14/4 = 1

    我发现@Eric cmets 关于编译器和架构在定义可变大小方面的作用非常真实和有趣。

    类型的大小最终由 C 实现决定 (尤其是编译器),而不是架构或操作系统。 虽然 C 实现通常受 架构,计算机实际上是通用图灵机,所以 可以实现任何所需的尺寸选择。 C 实现有时会根据考虑什么来选择大小 支持源代码而不是最有效的 架构。他们甚至可以通过以下方式支持选择尺寸 命令行开关。

    【讨论】:

    • 类型的大小最终由 C 实现(尤其是编译器)决定,而不是架构或操作系统。虽然 C 实现通常受体系结构的严重影响,但计算机实际上是通用图灵机,因此可以实现任何所需的大小选择。 C 实现有时会根据要支持哪些源代码而不是对体系结构最有效的考虑来选择大小。它们甚至可以支持通过命令行开关选择尺寸。
    • 同意埃里克。感谢分享。
    猜你喜欢
    • 2021-04-06
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    • 2021-08-11
    • 2015-05-13
    • 1970-01-01
    相关资源
    最近更新 更多