Recursive calls to a function - why is the address of the parameter passed to it lowering with each call?What is the direction of stack growth in most modern systems?Why isn't sizeof for a struct equal to the sum of sizeof of each member?How to call a parent class function from derived class function?Why do we need virtual functions in C++?Pretty-print C++ STL containersAre the days of passing const std::string & as a parameter over?Recursive Reverse FunctionWhy can I not move unique_ptr from a set to a function argument using an iterator?Why can I not call reserve on a vector of const elements?recursive variadic template function call “loses” pointer on second argument typeHaving issues with .h file, it doesn't seem to be linking correctly
Restricting the options of a lookup field, based on the value of another lookup field?
Could moose/elk survive in the Amazon forest?
Apply a different color ramp to subset of categorized symbols in QGIS?
"Whatever a Russian does, they end up making the Kalashnikov gun"? Are there any similar proverbs in English?
Check if a string is entirely made of the same substring
Where was the County of Thurn und Taxis located?
Mistake in years of experience in resume?
Philosophical question on logistic regression: why isn't the optimal threshold value trained?
Is there any pythonic way to find average of specific tuple elements in array?
Extracting Dirichlet series coefficients
Injection into a proper class and choice without regularity
Multiple options vs single option UI
Should the Product Owner dictate what info the UI needs to display?
Are there moral objections to a life motivated purely by money? How to sway a person from this lifestyle?
Does a large simulator bay have standard public address announcements?
How exactly does Hawking radiation decrease the mass of black holes?
Who's the random kid standing in the gathering at the end?
Creating a chemical industry from a medieval tech level without petroleum
SFDX - Create Objects with Custom Properties
Why do games have consumables?
How to have a sharp product image?
Will I lose my paid in full property
std::unique_ptr of base class holding reference of derived class does not show warning in gcc compiler while naked pointer shows it. Why?
Find a stone which is not the lightest one
Recursive calls to a function - why is the address of the parameter passed to it lowering with each call?
What is the direction of stack growth in most modern systems?Why isn't sizeof for a struct equal to the sum of sizeof of each member?How to call a parent class function from derived class function?Why do we need virtual functions in C++?Pretty-print C++ STL containersAre the days of passing const std::string & as a parameter over?Recursive Reverse FunctionWhy can I not move unique_ptr from a set to a function argument using an iterator?Why can I not call reserve on a vector of const elements?recursive variadic template function call “loses” pointer on second argument typeHaving issues with .h file, it doesn't seem to be linking correctly
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;
Consider following code:
#include <iostream>
using namespace std;
void test_func(int address)
cout<<&address<<" ";
if(address < 0x7FFBEE26)
test_func(address);
int main()
test_func(512);
cout<<"Hello";
return 0;
Hello from main() is certainly not reached, since the recursive calls to test_func never end.
However, from what I can see in the cout present in test_func - the addresses being printed are lower and lower with each iteration. Why is that happening?
c++ recursion memory-address
New contributor
|
show 1 more comment
Consider following code:
#include <iostream>
using namespace std;
void test_func(int address)
cout<<&address<<" ";
if(address < 0x7FFBEE26)
test_func(address);
int main()
test_func(512);
cout<<"Hello";
return 0;
Hello from main() is certainly not reached, since the recursive calls to test_func never end.
However, from what I can see in the cout present in test_func - the addresses being printed are lower and lower with each iteration. Why is that happening?
c++ recursion memory-address
New contributor
4
You are passing a copy - that has to have an address
– UnholySheep
Apr 22 at 20:50
1
Remember that the default stack size on linux is 10MB and its 1 MB on windows. Also the stack need not be in the same location each time you run your program.
– drescherjm
Apr 22 at 21:04
I can't understand why this isn't eligible for tail-call optimization. The invocation oftest_func
is the last line in the function...
– cyberbisson
Apr 22 at 21:33
9
@cyberbisson The parameters of the nested invocations oftest_func
must appear to have different addresses per language rules, and because the address ofaddress
was passed tooperator<<
the compiler can't prove that this is unobservable.
– T.C.
Apr 22 at 22:46
1
@Deduplicator Yes.
– T.C.
Apr 22 at 23:48
|
show 1 more comment
Consider following code:
#include <iostream>
using namespace std;
void test_func(int address)
cout<<&address<<" ";
if(address < 0x7FFBEE26)
test_func(address);
int main()
test_func(512);
cout<<"Hello";
return 0;
Hello from main() is certainly not reached, since the recursive calls to test_func never end.
However, from what I can see in the cout present in test_func - the addresses being printed are lower and lower with each iteration. Why is that happening?
c++ recursion memory-address
New contributor
Consider following code:
#include <iostream>
using namespace std;
void test_func(int address)
cout<<&address<<" ";
if(address < 0x7FFBEE26)
test_func(address);
int main()
test_func(512);
cout<<"Hello";
return 0;
Hello from main() is certainly not reached, since the recursive calls to test_func never end.
However, from what I can see in the cout present in test_func - the addresses being printed are lower and lower with each iteration. Why is that happening?
c++ recursion memory-address
c++ recursion memory-address
New contributor
New contributor
edited 2 days ago
Muntasir
6381919
6381919
New contributor
asked Apr 22 at 20:48
tears allotears allo
594
594
New contributor
New contributor
4
You are passing a copy - that has to have an address
– UnholySheep
Apr 22 at 20:50
1
Remember that the default stack size on linux is 10MB and its 1 MB on windows. Also the stack need not be in the same location each time you run your program.
– drescherjm
Apr 22 at 21:04
I can't understand why this isn't eligible for tail-call optimization. The invocation oftest_func
is the last line in the function...
– cyberbisson
Apr 22 at 21:33
9
@cyberbisson The parameters of the nested invocations oftest_func
must appear to have different addresses per language rules, and because the address ofaddress
was passed tooperator<<
the compiler can't prove that this is unobservable.
– T.C.
Apr 22 at 22:46
1
@Deduplicator Yes.
– T.C.
Apr 22 at 23:48
|
show 1 more comment
4
You are passing a copy - that has to have an address
– UnholySheep
Apr 22 at 20:50
1
Remember that the default stack size on linux is 10MB and its 1 MB on windows. Also the stack need not be in the same location each time you run your program.
– drescherjm
Apr 22 at 21:04
I can't understand why this isn't eligible for tail-call optimization. The invocation oftest_func
is the last line in the function...
– cyberbisson
Apr 22 at 21:33
9
@cyberbisson The parameters of the nested invocations oftest_func
must appear to have different addresses per language rules, and because the address ofaddress
was passed tooperator<<
the compiler can't prove that this is unobservable.
– T.C.
Apr 22 at 22:46
1
@Deduplicator Yes.
– T.C.
Apr 22 at 23:48
4
4
You are passing a copy - that has to have an address
– UnholySheep
Apr 22 at 20:50
You are passing a copy - that has to have an address
– UnholySheep
Apr 22 at 20:50
1
1
Remember that the default stack size on linux is 10MB and its 1 MB on windows. Also the stack need not be in the same location each time you run your program.
– drescherjm
Apr 22 at 21:04
Remember that the default stack size on linux is 10MB and its 1 MB on windows. Also the stack need not be in the same location each time you run your program.
– drescherjm
Apr 22 at 21:04
I can't understand why this isn't eligible for tail-call optimization. The invocation of
test_func
is the last line in the function...– cyberbisson
Apr 22 at 21:33
I can't understand why this isn't eligible for tail-call optimization. The invocation of
test_func
is the last line in the function...– cyberbisson
Apr 22 at 21:33
9
9
@cyberbisson The parameters of the nested invocations of
test_func
must appear to have different addresses per language rules, and because the address of address
was passed to operator<<
the compiler can't prove that this is unobservable.– T.C.
Apr 22 at 22:46
@cyberbisson The parameters of the nested invocations of
test_func
must appear to have different addresses per language rules, and because the address of address
was passed to operator<<
the compiler can't prove that this is unobservable.– T.C.
Apr 22 at 22:46
1
1
@Deduplicator Yes.
– T.C.
Apr 22 at 23:48
@Deduplicator Yes.
– T.C.
Apr 22 at 23:48
|
show 1 more comment
1 Answer
1
active
oldest
votes
Likely address
is being placed on the stack and, on your platform, the stack grows downward in memory. See this question about stack growth direction for more.
Is it placed on the stack instead of in a register because its address is taken?
– ᆼᆺᆼ
Apr 23 at 2:35
3
@ᆼᆺᆼ no, it is because on 32bit systems, the default calling convention in most C/C++ compilers iscdecl
, which passes parameters on the call stack only. Compile your code for 64bit, or alter your function to use a register-based calling convention, and you will likely see different results
– Remy Lebeau
Apr 23 at 2:55
@RemyLebeau What even is the address of a passed-by-register argument? Apparently, GCC artificially moves the register value onto the stack and then takes the address: godbolt.org/z/LRz5DS
– ComFreek
2 days ago
@ComFreek registers don't have addresses. Copying a register value to a memory block is the only way to get a memory address.
– Remy Lebeau
2 days ago
It's difficult to putaddress
in a register because there will be many instances ofaddress
at the same time, one for each instance oftest_func
that's in the process of executing.
– David Schwartz
2 days ago
add a comment |
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',
autoActivateHeartbeat: false,
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
);
);
tears allo is a new contributor. Be nice, and check out our Code of Conduct.
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%2f55800947%2frecursive-calls-to-a-function-why-is-the-address-of-the-parameter-passed-to-it%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Likely address
is being placed on the stack and, on your platform, the stack grows downward in memory. See this question about stack growth direction for more.
Is it placed on the stack instead of in a register because its address is taken?
– ᆼᆺᆼ
Apr 23 at 2:35
3
@ᆼᆺᆼ no, it is because on 32bit systems, the default calling convention in most C/C++ compilers iscdecl
, which passes parameters on the call stack only. Compile your code for 64bit, or alter your function to use a register-based calling convention, and you will likely see different results
– Remy Lebeau
Apr 23 at 2:55
@RemyLebeau What even is the address of a passed-by-register argument? Apparently, GCC artificially moves the register value onto the stack and then takes the address: godbolt.org/z/LRz5DS
– ComFreek
2 days ago
@ComFreek registers don't have addresses. Copying a register value to a memory block is the only way to get a memory address.
– Remy Lebeau
2 days ago
It's difficult to putaddress
in a register because there will be many instances ofaddress
at the same time, one for each instance oftest_func
that's in the process of executing.
– David Schwartz
2 days ago
add a comment |
Likely address
is being placed on the stack and, on your platform, the stack grows downward in memory. See this question about stack growth direction for more.
Is it placed on the stack instead of in a register because its address is taken?
– ᆼᆺᆼ
Apr 23 at 2:35
3
@ᆼᆺᆼ no, it is because on 32bit systems, the default calling convention in most C/C++ compilers iscdecl
, which passes parameters on the call stack only. Compile your code for 64bit, or alter your function to use a register-based calling convention, and you will likely see different results
– Remy Lebeau
Apr 23 at 2:55
@RemyLebeau What even is the address of a passed-by-register argument? Apparently, GCC artificially moves the register value onto the stack and then takes the address: godbolt.org/z/LRz5DS
– ComFreek
2 days ago
@ComFreek registers don't have addresses. Copying a register value to a memory block is the only way to get a memory address.
– Remy Lebeau
2 days ago
It's difficult to putaddress
in a register because there will be many instances ofaddress
at the same time, one for each instance oftest_func
that's in the process of executing.
– David Schwartz
2 days ago
add a comment |
Likely address
is being placed on the stack and, on your platform, the stack grows downward in memory. See this question about stack growth direction for more.
Likely address
is being placed on the stack and, on your platform, the stack grows downward in memory. See this question about stack growth direction for more.
answered Apr 22 at 20:50
David SchwartzDavid Schwartz
140k14147232
140k14147232
Is it placed on the stack instead of in a register because its address is taken?
– ᆼᆺᆼ
Apr 23 at 2:35
3
@ᆼᆺᆼ no, it is because on 32bit systems, the default calling convention in most C/C++ compilers iscdecl
, which passes parameters on the call stack only. Compile your code for 64bit, or alter your function to use a register-based calling convention, and you will likely see different results
– Remy Lebeau
Apr 23 at 2:55
@RemyLebeau What even is the address of a passed-by-register argument? Apparently, GCC artificially moves the register value onto the stack and then takes the address: godbolt.org/z/LRz5DS
– ComFreek
2 days ago
@ComFreek registers don't have addresses. Copying a register value to a memory block is the only way to get a memory address.
– Remy Lebeau
2 days ago
It's difficult to putaddress
in a register because there will be many instances ofaddress
at the same time, one for each instance oftest_func
that's in the process of executing.
– David Schwartz
2 days ago
add a comment |
Is it placed on the stack instead of in a register because its address is taken?
– ᆼᆺᆼ
Apr 23 at 2:35
3
@ᆼᆺᆼ no, it is because on 32bit systems, the default calling convention in most C/C++ compilers iscdecl
, which passes parameters on the call stack only. Compile your code for 64bit, or alter your function to use a register-based calling convention, and you will likely see different results
– Remy Lebeau
Apr 23 at 2:55
@RemyLebeau What even is the address of a passed-by-register argument? Apparently, GCC artificially moves the register value onto the stack and then takes the address: godbolt.org/z/LRz5DS
– ComFreek
2 days ago
@ComFreek registers don't have addresses. Copying a register value to a memory block is the only way to get a memory address.
– Remy Lebeau
2 days ago
It's difficult to putaddress
in a register because there will be many instances ofaddress
at the same time, one for each instance oftest_func
that's in the process of executing.
– David Schwartz
2 days ago
Is it placed on the stack instead of in a register because its address is taken?
– ᆼᆺᆼ
Apr 23 at 2:35
Is it placed on the stack instead of in a register because its address is taken?
– ᆼᆺᆼ
Apr 23 at 2:35
3
3
@ᆼᆺᆼ no, it is because on 32bit systems, the default calling convention in most C/C++ compilers is
cdecl
, which passes parameters on the call stack only. Compile your code for 64bit, or alter your function to use a register-based calling convention, and you will likely see different results– Remy Lebeau
Apr 23 at 2:55
@ᆼᆺᆼ no, it is because on 32bit systems, the default calling convention in most C/C++ compilers is
cdecl
, which passes parameters on the call stack only. Compile your code for 64bit, or alter your function to use a register-based calling convention, and you will likely see different results– Remy Lebeau
Apr 23 at 2:55
@RemyLebeau What even is the address of a passed-by-register argument? Apparently, GCC artificially moves the register value onto the stack and then takes the address: godbolt.org/z/LRz5DS
– ComFreek
2 days ago
@RemyLebeau What even is the address of a passed-by-register argument? Apparently, GCC artificially moves the register value onto the stack and then takes the address: godbolt.org/z/LRz5DS
– ComFreek
2 days ago
@ComFreek registers don't have addresses. Copying a register value to a memory block is the only way to get a memory address.
– Remy Lebeau
2 days ago
@ComFreek registers don't have addresses. Copying a register value to a memory block is the only way to get a memory address.
– Remy Lebeau
2 days ago
It's difficult to put
address
in a register because there will be many instances of address
at the same time, one for each instance oftest_func
that's in the process of executing.– David Schwartz
2 days ago
It's difficult to put
address
in a register because there will be many instances of address
at the same time, one for each instance oftest_func
that's in the process of executing.– David Schwartz
2 days ago
add a comment |
tears allo is a new contributor. Be nice, and check out our Code of Conduct.
tears allo is a new contributor. Be nice, and check out our Code of Conduct.
tears allo is a new contributor. Be nice, and check out our Code of Conduct.
tears allo is a new contributor. Be nice, and check out our Code of Conduct.
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.
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%2f55800947%2frecursive-calls-to-a-function-why-is-the-address-of-the-parameter-passed-to-it%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
You are passing a copy - that has to have an address
– UnholySheep
Apr 22 at 20:50
1
Remember that the default stack size on linux is 10MB and its 1 MB on windows. Also the stack need not be in the same location each time you run your program.
– drescherjm
Apr 22 at 21:04
I can't understand why this isn't eligible for tail-call optimization. The invocation of
test_func
is the last line in the function...– cyberbisson
Apr 22 at 21:33
9
@cyberbisson The parameters of the nested invocations of
test_func
must appear to have different addresses per language rules, and because the address ofaddress
was passed tooperator<<
the compiler can't prove that this is unobservable.– T.C.
Apr 22 at 22:46
1
@Deduplicator Yes.
– T.C.
Apr 22 at 23:48