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.
c++ c esp8266 arduino-esp8266
|
show 2 more comments
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.
c++ c esp8266 arduino-esp8266
4
Interesting. Perhaps after addingstatic
the functions are now inlined by the compiler, while before they were not? A function does not have to be explicitly marked withinline
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 TUstatic
) — 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
|
show 2 more comments
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.
c++ c esp8266 arduino-esp8266
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
c++ c esp8266 arduino-esp8266
edited Nov 11 at 5:48
asked Nov 10 at 19:31
Frank Meerkötter
1,60511421
1,60511421
4
Interesting. Perhaps after addingstatic
the functions are now inlined by the compiler, while before they were not? A function does not have to be explicitly marked withinline
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 TUstatic
) — 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
|
show 2 more comments
4
Interesting. Perhaps after addingstatic
the functions are now inlined by the compiler, while before they were not? A function does not have to be explicitly marked withinline
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 TUstatic
) — 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
|
show 2 more comments
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
active
oldest
votes
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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 withinline
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