C/C++ Compiler (cl.hlp) (
Table of Contents;
Topic list)
Important Notice
The pages on this site contain documentation for very old MS-DOS software,
purely for historical purposes.
If you're looking for up-to-date documentation, particularly for programming,
you should not rely on the information found here, as it will be woefully
out of date.
Quick-Data Memory Model: Details
◄Up► ◄Contents► ◄Index► ◄Back►
─────C/C++ Compiler─────────────────────────────────────────────────────────
Syntax: /Gx
Under the the compact, large, or huge memory model, the compiler
allocates initialized data items as near if they are smaller than
or equal in size to the threshold value set by the /Gt option. The
/Gx option extends this allocation rule for initialized data to
data that is uninitialized and data that is marked as extern.
Without the /Gx option, the compiler makes no assumptions about
where the linker places uninitialized or extern data. All
references to those data items are done with far addressing, in
case they are placed in a far segment.
■ The compiler can generate more efficient code to reference
data it knows is near.
■ You can achieve multiple instances of a single Windows
application when all data is near.
The /Gx option works only if the memory-model specification for
each individual data declaration (and its definition) is consistent
across compilation modules. That is, an individual data item is
either __near everywhere, __far everywhere, or its memory model is
not specified anywhere.
Use the /Gx option with either the /AC, the /AL, or the /AH option
to modify the compact, the large, or the huge memory model,
respectively. With /Gx, all three memory models still offer
multiple code and data segments.
To ensure that all data is near, mark unsized arrays as __near,
ensure that no data is marked as __far, and ensure that the data-
size threshold set with the /Gt option does not force anything far.
See: ◄Data Size Threshold (/Gt)►
◄Overriding Default Addressing►
Examples
CL /AL /Gx ONE.C TWO.C
This example compiles and links two modules, ONE.C and TWO.C,
using the large memory model. Assume that ONE.C contains an
external declaration of data (for example, extern struct strr;),
and TWO.C defines struct strr as __near. In this case, specifying
/Gx allows the compiler to safely generate more efficient code
than would be possible if the compiler had to assume that struct
strr might be far.
CL /AL /Gx /Gt8 ONE.C TWO.C
This example compiles and links two modules, ONE.C and TWO.C,
using the large memory model. Because the /Gt option sets a data
threshold size of eight bytes, the compiler assumes that all data
items smaller than eight bytes and either uninitialized or marked
as __extern are near.
NOTE: If you reference a data item with near addressing but declare
it with __far in another module, your program will produce
unpredictable results.
-♦-