当前位置: 首页 > 知识库问答 >
问题:

C语言中实现定义行为的澄清

柴寂离
2023-03-14

作为C语言中实现定义行为的一个例子,C标准说数据类型的大小由实现定义。所以,假设sizeof(int)是实现定义的。

>

编译代码后,当我在不同版本的平台上运行它时,实现依赖关系是否仍然适用?在一个平台上编译实现定义的代码并在另一个平台上运行它会导致性能损失吗?

共有3个答案

西门嘉石
2023-03-14

这种实现定义的行为是否意味着大小(int)依赖于平台,或者由编译器供应商定义,或者两者都定义?

在C标准术语中,实现是编译器。

以下是C标准中“实施”一词的实际定义:

(C99,3.12p1)实现:在特定的控制选项下,在特定的翻译环境中运行的一组特定软件,为特定的执行环境执行程序翻译,并支持在特定的执行环境中执行功能

宋景福
2023-03-14

这种实现定义的行为是否意味着大小(int)依赖于平台,或者由编译器供应商定义,或者两者都定义?

原则上,编译器供应商可以做出这个决定。实际上,如果编译器想要发出直接调用系统库的代码,那么它必须遵循与系统相同的“ABI”(应用程序二进制html" target="_blank">接口),除此之外,ABI将指定int的大小。因此,编译器供应商将“决定”使其达到ABI所说的大小。

针对多个平台和体系结构的编译器将在每个平台的配置中分别做出决定。然后,每个目标代表一个不同的C实现,即使您认为它是“同一个编译器”。

您可以编写一个一致的C实现,其中int的大小与运行该程序的操作系统上的大小不同。人们很少这样做,标准的图书馆在进行系统调用时必须跳转。作为仿真器的一部分,它可能很有用,但您可能会合理地认为“平台”是仿真平台,而不是具有不同大小int的主机平台。

一旦我编译了代码,当我在不同版本的平台上运行它时,实现依赖关系是否仍然适用?

sizeof(int)是一个编译时常量,这意味着编译器发出的代码可能会假定某个值。然后,该二进制代码无法在具有不同大小的int的不同版本的平台上正确运行。

在一个平台上编译实现定义的代码并在另一个平台上运行它会导致性能损失吗?

如果它真的有效,那么就没有特别的理由认为会出现性能损失。它通常根本不起作用(见上文),因为通常用于一个平台的二进制代码在另一个平台上不起作用。如果两个平台足够相似,确实可以工作,那么编译器为其中一个平台所做的优化可能不是对另一个平台的很好优化。在这种情况下,会出现性能损失,修复方法是重新编译针对正确(版本)平台的代码。

这种情况在ARM上确实会发生,在x86上则会发生。过去,不同的芯片基本上提供相同的指令集,但某些芯片上的某些指令与其他指令的成本明显不同。假设指令X速度快的优化在另一个指令X速度慢的芯片上可能是不好的优化。正如你可以想象的那样,这种差异并没有使芯片制造商在编译器供应商中大受欢迎,在汇编程序员中更是如此。

弓胜泫
2023-03-14

是的,实现定义意味着它取决于平台(Architecture OS ABI编译器)。

是的,实现定义的功能可以在不同版本的平台上有所不同。

 类似资料:
  • #define 叫做 宏定义命令,它也是C语言预处理命令的一种。所谓 宏定义,就是用一个标识符来表示一个字符串,如果在后面的代码中出现了该标识符,那么就全部替换成指定的字符串。 我们先通过一个例子来看一下 #define 的用法: 运行结果: 120 注意第 6 行代码 , 被 代替了。 就是宏定义, 为宏名, 是宏的内容(宏所表示的字符串)。在预处理阶段,对程序中所有出现的“宏名”,预处理器都会

  • 主要内容:C语言无参函数的定义,C语言有参函数的定义,函数不能嵌套定义函数是一段可以重复使用的代码,用来独立地完成某个功能,它可以接收用户传递的数据,也可以不接收。接收用户数据的函数在定义时要指明参数,不接收用户数据的不需要指明,根据这一点可以将函数分为有参函数和无参函数。 将代码段封装成函数的过程叫做 函数定义。 C语言无参函数的定义 如果函数不接收用户传递的数据,那么定义时可以不带参数。如下所示: dataType  functionName(){     //

  • C语言允许宏带有参数。在宏定义中的参数称为“形式参数”,在宏调用中的参数称为“实际参数”,这点和函数有些类似。 对带参数的宏,在展开过程中不仅要进行字符串替换,还要用实参去替换形参。 带参宏定义的一般形式为: #define 宏名(形参列表) 字符串 在字符串中可以含有各个形参。 带参宏调用的一般形式为: 宏名(实参列表); 例如: 在宏展开时,用实参 5 去代替形参 y,经预处理程序展开后的语句

  • 我正在学习如何在c中实现Mergesort,遇到了以下问题。 这是我的合并函数,它将两个排序数组合并为一个排序数组。 在任何时候,我都使用代码A或代码B。当我使用代码A时,函数按预期执行。然而,当我使用CODE B时,函数会用随机数据填充数组列表。 printArray是一个自定义函数,用于打印数组、列表。当对一组数字{4,2,6,9}进行排序时,我从printArray函数中得到以下输出:

  • 本文向大家介绍C语言单链表的实现,包括了C语言单链表的实现的使用技巧和注意事项,需要的朋友参考一下 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。 链表结构: SList.h SList.cpp Test.cpp 以上内容是小编给大家介绍的C语言单链表的实现代码,希望对大家有所帮助!

  • 本文向大家介绍Objective-C语言定义和分配,包括了Objective-C语言定义和分配的使用技巧和注意事项,需要的朋友参考一下 示例 一个执行两个双精度数加法的块,分配给变量addition: 随后可以像下面这样调用该块: