Sco*_*ski 83

目前接受的答案是有些不完整.

COMDAT部分的目的是允许在多个目标文件中定义"重复"部分.通常,如果在多个目标文件中定义了相同的符号,则链接器将报告错误.这可能会导致某些C++语言功能(如模板)出现问题,这些功能可能会在不同的cpp文件中实例化相同的符号.

COMDAT部分用于解决这个问题.当某个部分在目标文件中标记为COMDAT时,它还会指定一个标志,指示应如何解决冲突.有很多选项,包括"只选择你喜欢的人","确保所有重复.大小相同","确保所有重复.具有相同的内容","选择最大的",等等. COFF规范的完整列表.

无论如何,与目前接受的答案所说的不同,COMDAT部分的内容必须是这样或那样的.它们可以包含一个过程,许多过程,数据或代码和数据的任意组合.

  • COMDAT == 通用数据? (5认同)

Dmi*_*nko 5

/ Gy选项很适合在发布版本中使用.因为每个函数都有它自己的部分,链接器可以删除每个未使用的代码段.如果你没有指定/ Gy选项,你会得到这样的结果:"a.cpp"定义了3个函数,编译器在编译时将它们放在一个代码段中."main.cpp"只使用"a.cpp"中的一个函数,但是当链接"a.cpp"中的所有函数时,它们将被链接(其中两个作为负担).如果每个函数都有自己的部分,链接器只能选择一个包含"main.cpp"所需函数的函数.不使用/ Gy选项进行编译对于调试版本是有用的.编译类时,默认情况下,它的所有方法都有自己独立的部分.

  • 这是旧的,但对于任何人的信息:这不是链接器的工作方式.有一个完全不同的开关控制未引用的功能:/ OPT:REF(优化 - >参考:是).在它下面还有另一个合并相同功能的权利,/ OPT:ICF.ICF仅适用于/ Gy,但REF可以使用或不使用. (3认同)