Reasons why adding static to all the functions in a translation unit may increase the size of the resulting object file?









up vote
4
down vote

favorite












My intention is to limit the visibility of a number of symbols to the translation unit where they are defined. This commit is adding 688 bytes to the resulting firmware file. Any ideas why?



The compiler involved is a GCC 4.8.2
The target device is an ESP-8266 microcontroller.
The optimizer is set to -Os.










share|improve this question



















  • 4




    Interesting. Perhaps after adding static the functions are now inlined by the compiler, while before they were not? A function does not have to be explicitly marked with inline to be inlined.
    – kfx
    Nov 10 at 19:47











  • In my opinion, it is good practice to do as you are doing (make all functions not used outside their TU static) — you can routinely see it in the C code I post on SO, though I don't usually comment on it. So, good job on doing that. If, as seems plausible, inlining causes the growth and that is a problem for you, you may need to investigate 'optimizing for space' instead of 'optimizing for speed'. (GCC 8.2.0 documentation on Optimizing options. You'll need the equivalent for 4.8.2 — easy to deduce.)
    – Jonathan Leffler
    Nov 10 at 21:32






  • 2




    What optimization levels are you using? Does this happen with -Os optimisation? Probably one function is inlined twice or more, thus you will get bigger resulting firmare. Can you check what if you mark all those functions with __attribute__((__noinline__))?
    – Kamil Cuk
    Nov 10 at 21:36










  • Try compiling with -Os ?
    – M.M
    Nov 10 at 21:55










  • Updated the question with the optimization level used.
    – Frank Meerkötter
    Nov 11 at 5:49














up vote
4
down vote

favorite












My intention is to limit the visibility of a number of symbols to the translation unit where they are defined. This commit is adding 688 bytes to the resulting firmware file. Any ideas why?



The compiler involved is a GCC 4.8.2
The target device is an ESP-8266 microcontroller.
The optimizer is set to -Os.










share|improve this question



















  • 4




    Interesting. Perhaps after adding static the functions are now inlined by the compiler, while before they were not? A function does not have to be explicitly marked with inline to be inlined.
    – kfx
    Nov 10 at 19:47











  • In my opinion, it is good practice to do as you are doing (make all functions not used outside their TU static) — you can routinely see it in the C code I post on SO, though I don't usually comment on it. So, good job on doing that. If, as seems plausible, inlining causes the growth and that is a problem for you, you may need to investigate 'optimizing for space' instead of 'optimizing for speed'. (GCC 8.2.0 documentation on Optimizing options. You'll need the equivalent for 4.8.2 — easy to deduce.)
    – Jonathan Leffler
    Nov 10 at 21:32






  • 2




    What optimization levels are you using? Does this happen with -Os optimisation? Probably one function is inlined twice or more, thus you will get bigger resulting firmare. Can you check what if you mark all those functions with __attribute__((__noinline__))?
    – Kamil Cuk
    Nov 10 at 21:36










  • Try compiling with -Os ?
    – M.M
    Nov 10 at 21:55










  • Updated the question with the optimization level used.
    – Frank Meerkötter
    Nov 11 at 5:49












up vote
4
down vote

favorite









up vote
4
down vote

favorite











My intention is to limit the visibility of a number of symbols to the translation unit where they are defined. This commit is adding 688 bytes to the resulting firmware file. Any ideas why?



The compiler involved is a GCC 4.8.2
The target device is an ESP-8266 microcontroller.
The optimizer is set to -Os.










share|improve this question















My intention is to limit the visibility of a number of symbols to the translation unit where they are defined. This commit is adding 688 bytes to the resulting firmware file. Any ideas why?



The compiler involved is a GCC 4.8.2
The target device is an ESP-8266 microcontroller.
The optimizer is set to -Os.







c++ c esp8266 arduino-esp8266






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 11 at 5:48

























asked Nov 10 at 19:31









Frank Meerkötter

1,60511421




1,60511421







  • 4




    Interesting. Perhaps after adding static the functions are now inlined by the compiler, while before they were not? A function does not have to be explicitly marked with inline to be inlined.
    – kfx
    Nov 10 at 19:47











  • In my opinion, it is good practice to do as you are doing (make all functions not used outside their TU static) — you can routinely see it in the C code I post on SO, though I don't usually comment on it. So, good job on doing that. If, as seems plausible, inlining causes the growth and that is a problem for you, you may need to investigate 'optimizing for space' instead of 'optimizing for speed'. (GCC 8.2.0 documentation on Optimizing options. You'll need the equivalent for 4.8.2 — easy to deduce.)
    – Jonathan Leffler
    Nov 10 at 21:32






  • 2




    What optimization levels are you using? Does this happen with -Os optimisation? Probably one function is inlined twice or more, thus you will get bigger resulting firmare. Can you check what if you mark all those functions with __attribute__((__noinline__))?
    – Kamil Cuk
    Nov 10 at 21:36










  • Try compiling with -Os ?
    – M.M
    Nov 10 at 21:55










  • Updated the question with the optimization level used.
    – Frank Meerkötter
    Nov 11 at 5:49












  • 4




    Interesting. Perhaps after adding static the functions are now inlined by the compiler, while before they were not? A function does not have to be explicitly marked with inline to be inlined.
    – kfx
    Nov 10 at 19:47











  • In my opinion, it is good practice to do as you are doing (make all functions not used outside their TU static) — you can routinely see it in the C code I post on SO, though I don't usually comment on it. So, good job on doing that. If, as seems plausible, inlining causes the growth and that is a problem for you, you may need to investigate 'optimizing for space' instead of 'optimizing for speed'. (GCC 8.2.0 documentation on Optimizing options. You'll need the equivalent for 4.8.2 — easy to deduce.)
    – Jonathan Leffler
    Nov 10 at 21:32






  • 2




    What optimization levels are you using? Does this happen with -Os optimisation? Probably one function is inlined twice or more, thus you will get bigger resulting firmare. Can you check what if you mark all those functions with __attribute__((__noinline__))?
    – Kamil Cuk
    Nov 10 at 21:36










  • Try compiling with -Os ?
    – M.M
    Nov 10 at 21:55










  • Updated the question with the optimization level used.
    – Frank Meerkötter
    Nov 11 at 5:49







4




4




Interesting. Perhaps after adding static the functions are now inlined by the compiler, while before they were not? A function does not have to be explicitly marked with inline to be inlined.
– kfx
Nov 10 at 19:47





Interesting. Perhaps after adding static the functions are now inlined by the compiler, while before they were not? A function does not have to be explicitly marked with inline to be inlined.
– kfx
Nov 10 at 19:47













In my opinion, it is good practice to do as you are doing (make all functions not used outside their TU static) — you can routinely see it in the C code I post on SO, though I don't usually comment on it. So, good job on doing that. If, as seems plausible, inlining causes the growth and that is a problem for you, you may need to investigate 'optimizing for space' instead of 'optimizing for speed'. (GCC 8.2.0 documentation on Optimizing options. You'll need the equivalent for 4.8.2 — easy to deduce.)
– Jonathan Leffler
Nov 10 at 21:32




In my opinion, it is good practice to do as you are doing (make all functions not used outside their TU static) — you can routinely see it in the C code I post on SO, though I don't usually comment on it. So, good job on doing that. If, as seems plausible, inlining causes the growth and that is a problem for you, you may need to investigate 'optimizing for space' instead of 'optimizing for speed'. (GCC 8.2.0 documentation on Optimizing options. You'll need the equivalent for 4.8.2 — easy to deduce.)
– Jonathan Leffler
Nov 10 at 21:32




2




2




What optimization levels are you using? Does this happen with -Os optimisation? Probably one function is inlined twice or more, thus you will get bigger resulting firmare. Can you check what if you mark all those functions with __attribute__((__noinline__))?
– Kamil Cuk
Nov 10 at 21:36




What optimization levels are you using? Does this happen with -Os optimisation? Probably one function is inlined twice or more, thus you will get bigger resulting firmare. Can you check what if you mark all those functions with __attribute__((__noinline__))?
– Kamil Cuk
Nov 10 at 21:36












Try compiling with -Os ?
– M.M
Nov 10 at 21:55




Try compiling with -Os ?
– M.M
Nov 10 at 21:55












Updated the question with the optimization level used.
– Frank Meerkötter
Nov 11 at 5:49




Updated the question with the optimization level used.
– Frank Meerkötter
Nov 11 at 5:49

















active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");

StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);













draft saved

draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53242671%2freasons-why-adding-static-to-all-the-functions-in-a-translation-unit-may-increas%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown






























active

oldest

votes













active

oldest

votes









active

oldest

votes






active

oldest

votes















draft saved

draft discarded
















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid


  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.





Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


Please pay close attention to the following guidance:


  • Please be sure to answer the question. Provide details and share your research!

But avoid


  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53242671%2freasons-why-adding-static-to-all-the-functions-in-a-translation-unit-may-increas%23new-answer', 'question_page');

);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







這個網誌中的熱門文章

How to read a connectionString WITH PROVIDER in .NET Core?

In R, how to develop a multiplot heatmap.2 figure showing key labels successfully

Museum of Modern and Contemporary Art of Trento and Rovereto