COMDAT节用于什么?

42

可能是[函数级别链接(VC++中的/Gy开关)-有什么用?]的重复问题。(https://dev59.com/V3RB5IYBdhLWcg3wa2q2) - Michael Mrozek
2个回答

103
COMDAT段的目的是允许在多个目标文件中定义“重复”段。通常,如果同一符号在多个目标文件中被定义,链接器会报告错误。这可能会对某些C ++语言功能(如模板)造成问题,因为它们可能会在不同的cpp文件中实例化相同的符号。
COMDAT段用于解决此问题。当一个段在一个目标文件中被标记为COMDAT时,它还指定了一个标志,指示如何解决冲突。有许多选择,包括“随便选一个”,“确保所有重复项大小相同”,“确保所有重复项具有相同的内容”,“选择最大的一个”等。请参见COFF规范以获取完整列表。
无论如何,与其他答案所说的不同,COMDAT段的内容没有任何要求。它们可以包含一个过程、多个过程、数据或任何代码和数据的组合。

4
COMDAT 是可重定位目标文件中的一种编译器优化,它允许多个目标文件共享相同的函数或数据定义。在某些情况下,COMDAT 可以看作是“公共数据”。 - 0xC0000022L

7
/Gy选项在发布构建中使用非常好。因为每个函数都有自己的部分,链接器可以删除每个未使用的代码。 如果您不指定/Gy选项,您将得到类似于以下内容: "a.cpp"定义了3个函数,并且编译器在编译时将它们放在一个代码段中。 "main.cpp"仅使用来自"a.cpp"的一个函数,但是在链接所有来自"a.cpp"的函数时将被链接(其中两个作为负担)。如果每个函数都有自己的部分,链接器只能选择包含"main.cpp"所需函数的部分。 在调试构建中编译时,不使用/Gy选项很好。 编译类时,默认情况下,它的所有方法都会获得自己单独的部分。

5
这虽然有些老旧,但供大家参考:链接器并不是这样工作的。有一个完全不同的开关来控制未被引用的函数:/OPT:REF(优化->引用:是)。它下面还有另一个可以合并相同函数的选项,/OPT:ICF。ICF 只能在使用 /Gy 时起作用,但 REF 可以与 /Gy 或不与其一起使用。 - SilverbackNet
1
仅供参考,/OPT 是 MSVC 链接器选项。参考链接:https://learn.microsoft.com/en-us/cpp/build/reference/opt-optimizations?view=vs-2015 - smwikipedia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接