什么是COMDAT部分用于?

时间:2009-12-02 17:43:42

标签: c++ windows coff

我看到/ Gy选项,我想知道为什么要使用它? http://msdn.microsoft.com/en-us/library/xsa71f43.aspx

2 个答案:

答案 0 :(得分:81)

currently accepted answer有些不完整。

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

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

在任何情况下,与currently accepted answer所说的不同,对于COMDAT部分的内容必须有什么要求,无论如何。它们可以包含一个过程,许多过程,数据或代码和数据的任意组合。

答案 1 :(得分:5)

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