Skip to content

Instantly share code, notes, and snippets.

@goyusia
Last active October 4, 2015 12:11
Show Gist options
  • Select an option

  • Save goyusia/9a0228d5655d6ad03e19 to your computer and use it in GitHub Desktop.

Select an option

Save goyusia/9a0228d5655d6ad03e19 to your computer and use it in GitHub Desktop.
Different local stack variable policy (g++/clang)
/*
g++ version : -W
struct size = 7
stack version addr diff = 16
array version addr diff = 7
new[] version addr diff = 7
struct size = 15
stack version addr diff = 16
array version addr diff = 15
new[] version addr diff = 15
struct size = 31
stack version addr diff = 32
array version addr diff = 31
new[] version addr diff = 31
clang++ version : -W
struct size = 7
stack version addr diff = -8
array version addr diff = 7
new[] version addr diff = 7
struct size = 15
stack version addr diff = -16
array version addr diff = 15
new[] version addr diff = 15
struct size = 31
stack version addr diff = -32
array version addr diff = 31
new[] version addr diff = 31
g++ version : -W -O3
struct size = 7
stack version addr diff = 16
array version addr diff = 7
new[] version addr diff = 7
struct size = 15
stack version addr diff = 16
array version addr diff = 15
new[] version addr diff = 15
struct size = 31
stack version addr diff = 32
array version addr diff = 31
new[] version addr diff = 31
clang++ version : -W -O3
struct size = 7
stack version addr diff = -32
array version addr diff = 7
new[] version addr diff = 7
struct size = 15
stack version addr diff = -32
array version addr diff = 15
new[] version addr diff = 15
struct size = 31
stack version addr diff = -32
array version addr diff = 31
new[] version addr diff = 31
*/
#include <cstdio>
#include <cassert>
template<int N>
class Sample {
char padding[N];
};
template<typename T>
void stack_version()
{
T a;
T b;
int diff = (unsigned long)&b - (unsigned long)&a;
printf("stack version addr diff = %d\n", diff);
}
template<typename T>
void array_version()
{
T arr[2];
int diff = (unsigned long)&arr[1] - (unsigned long)&arr[0];
printf("array version addr diff = %d\n", diff);
}
template<typename T>
void new_array_version()
{
T *data = new T[2];
int diff = (unsigned long)(data+1) - (unsigned long)data;
printf("new[] version addr diff = %d\n", diff);
delete[](data);
}
template<typename T>
void test_main()
{
printf("struct size = %d\n", (int)sizeof(T));
stack_version<T>();
array_version<T>();
new_array_version<T>();
}
int main()
{
test_main< Sample<7> >();
test_main< Sample<15> >();
test_main< Sample<31> >();
return 0;
}
CXX_FLAGS = -W
SRC = different_stack_variable_policy.cpp
all:
@make gcc
@echo ""
@make clang
gcc:
@g++ $(SRC) $(CXX_FLAGS)
@echo "g++ version : $(CXX_FLAGS)"
@./a.out
clang:
@clang++ $(SRC) $(CXX_FLAGS)
@echo "clang++ version : $(CXX_FLAGS)"
@./a.out
@goyusia

goyusia commented Oct 4, 2015

Copy link
Copy Markdown
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment