Channels ▼

The Most Underused Compiler Switches in Visual C++

, March 11, 2014 Microsoft's Visual C++ team explains the nine most underused switches and why you should make sure to include them in your build.
  • E-mail
  • Print

/Gy and /Gw

A compiler can only optimize away data or a function if it can prove that the data or function will never be referenced. In a non-LTCG compile (i.e., a build with Whole Program Optimization (WPO) disabled), the compiler's visibility is limited to a single module (.obj), so for data and function that has global scope, the compiler will never know if other modules make use of them. As a result, the compiler can never optimize them away. The linker has a good view of all the modules that will be linked together, so the linker is in a good position to optimize away unused global data and unreferenced functions. The linker, however, manipulates on a section level, so if the unreferenced data/functions are mixed with other data or functions in a section, the linker won't be able to extract and remove. To equip the linker to remove unused global data and functions, we need to put each global data or function in a separate section. These small sections are called COMDAT.

Using the /Gy compiler switch instructs the compiler to package only individual functions in the form of packaged functions or COMDATs, each with its own section header information. This enables function-level linkage and linker optimizations ICF (folding together identical COMDATs) and REF(eliminating unreferenced COMDATs). In VS2013, we have introduced a new compiler switch — /Gw — that extends these linker-optimization benefits to data as well.

Additional comments:

These switches enable linker optimizations that greatly help in reducing the size of the application, thus providing better cache locality and overall "goodness" with respect to memory — which also results in runtime performance gains.






Currently we allow the following HTML tags in comments:

Single tags

These tags can be used alone and don't need an ending tag.

<br> Defines a single line break

<hr> Defines a horizontal line

Matching tags

These require an ending tag - e.g. <i>italic text</i>

<a> Defines an anchor

<b> Defines bold text

<big> Defines big text

<blockquote> Defines a long quotation

<caption> Defines a table caption

<cite> Defines a citation

<code> Defines computer code text

<em> Defines emphasized text

<fieldset> Defines a border around elements in a form

<h1> This is heading 1

<h2> This is heading 2

<h3> This is heading 3

<h4> This is heading 4

<h5> This is heading 5

<h6> This is heading 6

<i> Defines italic text

<p> Defines a paragraph

<pre> Defines preformatted text

<q> Defines a short quotation

<samp> Defines sample computer code text

<small> Defines small text

<span> Defines a section in a document

<s> Defines strikethrough text

<strike> Defines strikethrough text

<strong> Defines strong text

<sub> Defines subscripted text

<sup> Defines superscripted text

<u> Defines underlined text

Dr. Dobb's encourages readers to engage in spirited, healthy debate, including taking us to task. However, Dr. Dobb's moderates all comments posted to our site, and reserves the right to modify or remove any content that it determines to be derogatory, offensive, inflammatory, vulgar, irrelevant/off-topic, racist or obvious marketing or spam. Dr. Dobb's further reserves the right to disable the profile of any commenter participating in said activities.

 
Disqus Tips To upload an avatar photo, first complete your Disqus profile. | View the list of supported HTML tags you can use to style comments. | Please read our commenting policy.