什么是COMDAT部分用于?

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

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

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

COMDAT部分用于解决这个问题。 当某个节在对象文件中被标记为COMDAT时,它还指定一个标志来指示如何解决冲突。 有很多选择,包括“只挑你喜欢的人”,“确保所有的双胞胎都是一样的大小”,“确保所有的双胞胎,有相同的内容”,“挑最大的”等。 COFF规范的完整列表。

在任何情况下,与目前接受的答案不同,对于COMDAT部分的内容是什么都没有要求,无论如何。 它们可以包含一个程序,许多程序,数据或代码和数据的任何组合。

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