⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vague-linkage.html

📁 gcc手册
💻 HTML
字号:
<html lang="en">

<head>

<title>Using the GNU Compiler Collection (GCC)</title>

<meta http-equiv="Content-Type" content="text/html">

<meta name="description" content="Using the GNU Compiler Collection (GCC)">

<meta name="generator" content="makeinfo 4.3">

<link href="http://www.gnu.org/software/texinfo/" rel="generator-home">

<!--

Copyright &copy; 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,

1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.



   <p>Permission is granted to copy, distribute and/or modify this document

under the terms of the GNU Free Documentation License, Version 1.2 or

any later version published by the Free Software Foundation; with the

Invariant Sections being "GNU General Public License" and "Funding

Free Software", the Front-Cover texts being (a) (see below), and with

the Back-Cover Texts being (b) (see below).  A copy of the license is

included in the section entitled "GNU Free Documentation License".



   <p>(a) The FSF's Front-Cover Text is:



   <p>A GNU Manual



   <p>(b) The FSF's Back-Cover Text is:



   <p>You have freedom to copy and modify this GNU Manual, like GNU

     software.  Copies published by the Free Software Foundation raise

     funds for GNU development.-->

</head>

<body>

<div class="node">

<p>

Node:<a name="Vague%20Linkage">Vague Linkage</a>,

Next:<a rel="next" accesskey="n" href="C---Interface.html#C++%20Interface">C++ Interface</a>,

Previous:<a rel="previous" accesskey="p" href="Restricted-Pointers.html#Restricted%20Pointers">Restricted Pointers</a>,

Up:<a rel="up" accesskey="u" href="C---Extensions.html#C++%20Extensions">C++ Extensions</a>

<hr><br>

</div>



<h3 class="section">Vague Linkage</h3>



   <p>There are several constructs in C++ which require space in the object

file but are not clearly tied to a single translation unit.  We say that

these constructs have "vague linkage".  Typically such constructs are

emitted wherever they are needed, though sometimes we can be more

clever.



     <dl>

<dt>Inline Functions

     <dd>Inline functions are typically defined in a header file which can be

included in many different compilations.  Hopefully they can usually be

inlined, but sometimes an out-of-line copy is necessary, if the address

of the function is taken or if inlining fails.  In general, we emit an

out-of-line copy in all translation units where one is needed.  As an

exception, we only emit inline virtual functions with the vtable, since

it will always require a copy.



     <p>Local static variables and string constants used in an inline function

are also considered to have vague linkage, since they must be shared

between all inlined and out-of-line instances of the function.



     <br><dt>VTables

     <dd>C++ virtual functions are implemented in most compilers using a lookup

table, known as a vtable.  The vtable contains pointers to the virtual

functions provided by a class, and each object of the class contains a

pointer to its vtable (or vtables, in some multiple-inheritance

situations).  If the class declares any non-inline, non-pure virtual

functions, the first one is chosen as the "key method" for the class,

and the vtable is only emitted in the translation unit where the key

method is defined.



     <p><em>Note:</em> If the chosen key method is later defined as inline, the

vtable will still be emitted in every translation unit which defines it. 

Make sure that any inline virtuals are declared inline in the class

body, even if they are not defined there.



     <br><dt>type_info objects

     <dd>C++ requires information about types to be written out in order to

implement <code>dynamic_cast</code>, <code>typeid</code> and exception handling. 

For polymorphic classes (classes with virtual functions), the type_info

object is written out along with the vtable so that <code>dynamic_cast</code>

can determine the dynamic type of a class object at runtime.  For all

other types, we write out the type_info object when it is used: when

applying <code>typeid</code> to an expression, throwing an object, or

referring to a type in a catch clause or exception specification.



     <br><dt>Template Instantiations

     <dd>Most everything in this section also applies to template instantiations,

but there are other options as well. 

See <a href="Template-Instantiation.html#Template%20Instantiation">Where's the Template?</a>.



   </dl>



   <p>When used with GNU ld version 2.8 or later on an ELF system such as

Linux/GNU or Solaris 2, or on Microsoft Windows, duplicate copies of

these constructs will be discarded at link time.  This is known as

COMDAT support.



   <p>On targets that don't support COMDAT, but do support weak symbols, GCC

will use them.  This way one copy will override all the others, but

the unused copies will still take up space in the executable.



   <p>For targets which do not support either COMDAT or weak symbols,

most entities with vague linkage will be emitted as local symbols to

avoid duplicate definition errors from the linker.  This will not happen

for local statics in inlines, however, as having multiple copies will

almost certainly break things.



   <p>See <a href="C---Interface.html#C++%20Interface">Declarations and Definitions in One Header</a>, for

another way to control placement of these constructs.



   </body></html>



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -