why sizeof(Base) is not different of sizeof(Derived)What is the difference between #include <filename> and #include “filename”?What are the differences between a pointer variable and a reference variable in C++?Why isn't sizeof for a struct equal to the sum of sizeof of each member?What is the difference between an abstract function and a virtual function?Why is “using namespace std;” considered bad practice?Why does an overridden function in the derived class hide other overloads of the base class?Why do we need virtual functions in C++?Why does sizeof(x++) not increment x?Image Processing: Algorithm Improvement for 'Coca-Cola Can' RecognitionWhy is processing a sorted array faster than processing an unsorted array?
What are the advantages of this gold finger shape?
How was the murder committed?
A trip to the library
Bringing Power Supplies on Plane?
Global BGP Routing only by only importing supernet prefixes
Help, I cannot decide when to start the story
What kind of liquid can be seen 'leaking' from the upper surface of the wing of a Boeing 737-800?
What are the odds of rolling specific ability score totals in D&D?
Link for download latest Edubuntu
What unique challenges/limitations will I face if I start a career as a pilot at 45 years old?
Why does the cable resistance jump from a low value to high value at a particular frequency?
Chunk + Enumerate a list of digits
Will using a resistor in series with a LED to control its voltage increase the total energy expenditure?
What is the prop for Thor's hammer made of?
How can I communicate my issues with a potential date's pushy behavior?
Escape Velocity - Won't the orbital path just become larger with higher initial velocity?
Why not demand President's/candidate's financial records instead of tax returns?
Finding the shaded region
Should I leave building the database for the end?
Prestidigitation to replace bathing and washing clothes worn?
How would you translate this? バタコチーズライス
What would it take to get a message to another star?
If a person claims to know anything could it be disproven by saying 'prove that we are not in a simulation'?
graphs in latex
why sizeof(Base) is not different of sizeof(Derived)
What is the difference between #include <filename> and #include “filename”?What are the differences between a pointer variable and a reference variable in C++?Why isn't sizeof for a struct equal to the sum of sizeof of each member?What is the difference between an abstract function and a virtual function?Why is “using namespace std;” considered bad practice?Why does an overridden function in the derived class hide other overloads of the base class?Why do we need virtual functions in C++?Why does sizeof(x++) not increment x?Image Processing: Algorithm Improvement for 'Coca-Cola Can' RecognitionWhy is processing a sorted array faster than processing an unsorted array?
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
I think sizeof(Base)
should be 12. Why is it 16?
Without the virtual function, I get 4 and 8.
class Base
public:
int i;
virtual void Print()cout<<"Base Print";
;
class Derived:public Base
public:
int n;
virtual void Print()cout<<"Derived Print";
;
int main()
Derived d;
cout<<sizeof(Base)<<","<<sizeof(d);
return 0;
expected result:12,16
actual result:16,16
c++ sizeof virtual-functions memory-layout vptr
add a comment |
I think sizeof(Base)
should be 12. Why is it 16?
Without the virtual function, I get 4 and 8.
class Base
public:
int i;
virtual void Print()cout<<"Base Print";
;
class Derived:public Base
public:
int n;
virtual void Print()cout<<"Derived Print";
;
int main()
Derived d;
cout<<sizeof(Base)<<","<<sizeof(d);
return 0;
expected result:12,16
actual result:16,16
c++ sizeof virtual-functions memory-layout vptr
6
Maybe a padding issue?
– schande
Mar 27 at 11:25
add a comment |
I think sizeof(Base)
should be 12. Why is it 16?
Without the virtual function, I get 4 and 8.
class Base
public:
int i;
virtual void Print()cout<<"Base Print";
;
class Derived:public Base
public:
int n;
virtual void Print()cout<<"Derived Print";
;
int main()
Derived d;
cout<<sizeof(Base)<<","<<sizeof(d);
return 0;
expected result:12,16
actual result:16,16
c++ sizeof virtual-functions memory-layout vptr
I think sizeof(Base)
should be 12. Why is it 16?
Without the virtual function, I get 4 and 8.
class Base
public:
int i;
virtual void Print()cout<<"Base Print";
;
class Derived:public Base
public:
int n;
virtual void Print()cout<<"Derived Print";
;
int main()
Derived d;
cout<<sizeof(Base)<<","<<sizeof(d);
return 0;
expected result:12,16
actual result:16,16
c++ sizeof virtual-functions memory-layout vptr
c++ sizeof virtual-functions memory-layout vptr
edited Mar 27 at 11:54
curiousguy
5,0332 gold badges30 silver badges46 bronze badges
5,0332 gold badges30 silver badges46 bronze badges
asked Mar 27 at 11:20
Z.HcZ.Hc
212 bronze badges
212 bronze badges
6
Maybe a padding issue?
– schande
Mar 27 at 11:25
add a comment |
6
Maybe a padding issue?
– schande
Mar 27 at 11:25
6
6
Maybe a padding issue?
– schande
Mar 27 at 11:25
Maybe a padding issue?
– schande
Mar 27 at 11:25
add a comment |
2 Answers
2
active
oldest
votes
why sizeof(Base) is not different of sizeof(Derived)
Because of the alignment introduced by the compiler.
That is architecture-dependent, but for sake of simplicity, I am going to assume we are referring a 64-bit architecture.
Scenario 64 bit / Clang 8.0.
The alignment of the type Base
is 8
bytes:
alignOfBase(): # @alignOfBase()
mov eax, 8
ret
The layout of Base
is composed by the variable member (int
) and the virtual table (vtptr
).
If we assume a "common" architecture where:
int
is 4 bytes size.vtptr
is a pointer. On a 64 bit architecture is 8 bytes size.
We should have a sum of 4 + 8 = 12
, as you expect.
However, we need to remember the alignment of Base
is 8 bytes
. Therefore consecutive Base
types should be stored in location multiple of 8.
In order to guarantee that, the compiler introduces padding for Base
. That's why Base
is 16 bytes size.
For example, if we consider 2 consecutive Base
(base0
and base1
) without padding:
0: vtptr (base 0) + 8
8: int (base 0) + 4
12: vtptr (base 1) + 8 <--- Wrong! The address 12 is not multiple of 8.
20: int (base 1) + 4
With padding:
0: vtptr (base 0) + 8
8: int (base 0) + 4+4 (4 padding)
16: vtptr (base 1) +8 <--- Fine! The adress 16 is multiple of 8.
24: int (base 1) +4+4 (4 padding)
The same story is for Derived
type.
The layout of Derived
should be: vtptr + int + int
, that is, 8 + 4 + 4 = 16
.
The alignment of Derived
is 8
too:
alignOfDerived(): # @alignOfDerived()
mov eax, 8
ret
Indeed, in this case, there is no need to introduce padding in order to keep the Derived
aligned with the memory. The layout size will be the same as the real size.
0: vtptr (Derived 0)
8: int (Derived 0)
12: int (Derived 0)
16: vtptr (Derived 1) <---- Fine. 16 is multiple of 8.
24: int (Derived 1)
28: int (Derived 1)
1
You forgot to explain the difference between arrays and structs:struct T x1, x2; ;
(in principle) could have padding, butT x[2]
by definition can't, so anything that can be in an array (any concrete object type) must have a size compatible with its alignment.
– curiousguy
Mar 27 at 12:30
add a comment |
This happens due to compiler deciding to align your classes.
If you want (or need) structs or classes to have their "real" sizes, you can use #pragma pack(1)
like this:
#pragma pack(push, 1) // Set packing to 1 byte and push old packing value to stack
class Base
public:
int i;
virtual void Print()cout<<"Base Print";
;
class Derived:public Base
public:
int n;
virtual void Print()cout<<"Derived Print";
;
int main()
Derived d;
cout<<sizeof(Base)<<","<<sizeof(d);
return 0;
#pragma pack(pop) // restore old packing value
6
Note that unless you have a very strong reason for bypassing the alignment rules you probably shouldn't do it.
– Johan
Mar 27 at 11:31
Thank you, it really help me.
– Z.Hc
Mar 27 at 11:39
4
N.B.#pragma pack
is a compiler extension.
– Quentin
Mar 27 at 11:42
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
);
);
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%2f55375954%2fwhy-sizeofbase-is-not-different-of-sizeofderived%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
why sizeof(Base) is not different of sizeof(Derived)
Because of the alignment introduced by the compiler.
That is architecture-dependent, but for sake of simplicity, I am going to assume we are referring a 64-bit architecture.
Scenario 64 bit / Clang 8.0.
The alignment of the type Base
is 8
bytes:
alignOfBase(): # @alignOfBase()
mov eax, 8
ret
The layout of Base
is composed by the variable member (int
) and the virtual table (vtptr
).
If we assume a "common" architecture where:
int
is 4 bytes size.vtptr
is a pointer. On a 64 bit architecture is 8 bytes size.
We should have a sum of 4 + 8 = 12
, as you expect.
However, we need to remember the alignment of Base
is 8 bytes
. Therefore consecutive Base
types should be stored in location multiple of 8.
In order to guarantee that, the compiler introduces padding for Base
. That's why Base
is 16 bytes size.
For example, if we consider 2 consecutive Base
(base0
and base1
) without padding:
0: vtptr (base 0) + 8
8: int (base 0) + 4
12: vtptr (base 1) + 8 <--- Wrong! The address 12 is not multiple of 8.
20: int (base 1) + 4
With padding:
0: vtptr (base 0) + 8
8: int (base 0) + 4+4 (4 padding)
16: vtptr (base 1) +8 <--- Fine! The adress 16 is multiple of 8.
24: int (base 1) +4+4 (4 padding)
The same story is for Derived
type.
The layout of Derived
should be: vtptr + int + int
, that is, 8 + 4 + 4 = 16
.
The alignment of Derived
is 8
too:
alignOfDerived(): # @alignOfDerived()
mov eax, 8
ret
Indeed, in this case, there is no need to introduce padding in order to keep the Derived
aligned with the memory. The layout size will be the same as the real size.
0: vtptr (Derived 0)
8: int (Derived 0)
12: int (Derived 0)
16: vtptr (Derived 1) <---- Fine. 16 is multiple of 8.
24: int (Derived 1)
28: int (Derived 1)
1
You forgot to explain the difference between arrays and structs:struct T x1, x2; ;
(in principle) could have padding, butT x[2]
by definition can't, so anything that can be in an array (any concrete object type) must have a size compatible with its alignment.
– curiousguy
Mar 27 at 12:30
add a comment |
why sizeof(Base) is not different of sizeof(Derived)
Because of the alignment introduced by the compiler.
That is architecture-dependent, but for sake of simplicity, I am going to assume we are referring a 64-bit architecture.
Scenario 64 bit / Clang 8.0.
The alignment of the type Base
is 8
bytes:
alignOfBase(): # @alignOfBase()
mov eax, 8
ret
The layout of Base
is composed by the variable member (int
) and the virtual table (vtptr
).
If we assume a "common" architecture where:
int
is 4 bytes size.vtptr
is a pointer. On a 64 bit architecture is 8 bytes size.
We should have a sum of 4 + 8 = 12
, as you expect.
However, we need to remember the alignment of Base
is 8 bytes
. Therefore consecutive Base
types should be stored in location multiple of 8.
In order to guarantee that, the compiler introduces padding for Base
. That's why Base
is 16 bytes size.
For example, if we consider 2 consecutive Base
(base0
and base1
) without padding:
0: vtptr (base 0) + 8
8: int (base 0) + 4
12: vtptr (base 1) + 8 <--- Wrong! The address 12 is not multiple of 8.
20: int (base 1) + 4
With padding:
0: vtptr (base 0) + 8
8: int (base 0) + 4+4 (4 padding)
16: vtptr (base 1) +8 <--- Fine! The adress 16 is multiple of 8.
24: int (base 1) +4+4 (4 padding)
The same story is for Derived
type.
The layout of Derived
should be: vtptr + int + int
, that is, 8 + 4 + 4 = 16
.
The alignment of Derived
is 8
too:
alignOfDerived(): # @alignOfDerived()
mov eax, 8
ret
Indeed, in this case, there is no need to introduce padding in order to keep the Derived
aligned with the memory. The layout size will be the same as the real size.
0: vtptr (Derived 0)
8: int (Derived 0)
12: int (Derived 0)
16: vtptr (Derived 1) <---- Fine. 16 is multiple of 8.
24: int (Derived 1)
28: int (Derived 1)
1
You forgot to explain the difference between arrays and structs:struct T x1, x2; ;
(in principle) could have padding, butT x[2]
by definition can't, so anything that can be in an array (any concrete object type) must have a size compatible with its alignment.
– curiousguy
Mar 27 at 12:30
add a comment |
why sizeof(Base) is not different of sizeof(Derived)
Because of the alignment introduced by the compiler.
That is architecture-dependent, but for sake of simplicity, I am going to assume we are referring a 64-bit architecture.
Scenario 64 bit / Clang 8.0.
The alignment of the type Base
is 8
bytes:
alignOfBase(): # @alignOfBase()
mov eax, 8
ret
The layout of Base
is composed by the variable member (int
) and the virtual table (vtptr
).
If we assume a "common" architecture where:
int
is 4 bytes size.vtptr
is a pointer. On a 64 bit architecture is 8 bytes size.
We should have a sum of 4 + 8 = 12
, as you expect.
However, we need to remember the alignment of Base
is 8 bytes
. Therefore consecutive Base
types should be stored in location multiple of 8.
In order to guarantee that, the compiler introduces padding for Base
. That's why Base
is 16 bytes size.
For example, if we consider 2 consecutive Base
(base0
and base1
) without padding:
0: vtptr (base 0) + 8
8: int (base 0) + 4
12: vtptr (base 1) + 8 <--- Wrong! The address 12 is not multiple of 8.
20: int (base 1) + 4
With padding:
0: vtptr (base 0) + 8
8: int (base 0) + 4+4 (4 padding)
16: vtptr (base 1) +8 <--- Fine! The adress 16 is multiple of 8.
24: int (base 1) +4+4 (4 padding)
The same story is for Derived
type.
The layout of Derived
should be: vtptr + int + int
, that is, 8 + 4 + 4 = 16
.
The alignment of Derived
is 8
too:
alignOfDerived(): # @alignOfDerived()
mov eax, 8
ret
Indeed, in this case, there is no need to introduce padding in order to keep the Derived
aligned with the memory. The layout size will be the same as the real size.
0: vtptr (Derived 0)
8: int (Derived 0)
12: int (Derived 0)
16: vtptr (Derived 1) <---- Fine. 16 is multiple of 8.
24: int (Derived 1)
28: int (Derived 1)
why sizeof(Base) is not different of sizeof(Derived)
Because of the alignment introduced by the compiler.
That is architecture-dependent, but for sake of simplicity, I am going to assume we are referring a 64-bit architecture.
Scenario 64 bit / Clang 8.0.
The alignment of the type Base
is 8
bytes:
alignOfBase(): # @alignOfBase()
mov eax, 8
ret
The layout of Base
is composed by the variable member (int
) and the virtual table (vtptr
).
If we assume a "common" architecture where:
int
is 4 bytes size.vtptr
is a pointer. On a 64 bit architecture is 8 bytes size.
We should have a sum of 4 + 8 = 12
, as you expect.
However, we need to remember the alignment of Base
is 8 bytes
. Therefore consecutive Base
types should be stored in location multiple of 8.
In order to guarantee that, the compiler introduces padding for Base
. That's why Base
is 16 bytes size.
For example, if we consider 2 consecutive Base
(base0
and base1
) without padding:
0: vtptr (base 0) + 8
8: int (base 0) + 4
12: vtptr (base 1) + 8 <--- Wrong! The address 12 is not multiple of 8.
20: int (base 1) + 4
With padding:
0: vtptr (base 0) + 8
8: int (base 0) + 4+4 (4 padding)
16: vtptr (base 1) +8 <--- Fine! The adress 16 is multiple of 8.
24: int (base 1) +4+4 (4 padding)
The same story is for Derived
type.
The layout of Derived
should be: vtptr + int + int
, that is, 8 + 4 + 4 = 16
.
The alignment of Derived
is 8
too:
alignOfDerived(): # @alignOfDerived()
mov eax, 8
ret
Indeed, in this case, there is no need to introduce padding in order to keep the Derived
aligned with the memory. The layout size will be the same as the real size.
0: vtptr (Derived 0)
8: int (Derived 0)
12: int (Derived 0)
16: vtptr (Derived 1) <---- Fine. 16 is multiple of 8.
24: int (Derived 1)
28: int (Derived 1)
edited Mar 27 at 11:56
answered Mar 27 at 11:49
Biagio FestaBiagio Festa
6,2822 gold badges14 silver badges41 bronze badges
6,2822 gold badges14 silver badges41 bronze badges
1
You forgot to explain the difference between arrays and structs:struct T x1, x2; ;
(in principle) could have padding, butT x[2]
by definition can't, so anything that can be in an array (any concrete object type) must have a size compatible with its alignment.
– curiousguy
Mar 27 at 12:30
add a comment |
1
You forgot to explain the difference between arrays and structs:struct T x1, x2; ;
(in principle) could have padding, butT x[2]
by definition can't, so anything that can be in an array (any concrete object type) must have a size compatible with its alignment.
– curiousguy
Mar 27 at 12:30
1
1
You forgot to explain the difference between arrays and structs:
struct T x1, x2; ;
(in principle) could have padding, but T x[2]
by definition can't, so anything that can be in an array (any concrete object type) must have a size compatible with its alignment.– curiousguy
Mar 27 at 12:30
You forgot to explain the difference between arrays and structs:
struct T x1, x2; ;
(in principle) could have padding, but T x[2]
by definition can't, so anything that can be in an array (any concrete object type) must have a size compatible with its alignment.– curiousguy
Mar 27 at 12:30
add a comment |
This happens due to compiler deciding to align your classes.
If you want (or need) structs or classes to have their "real" sizes, you can use #pragma pack(1)
like this:
#pragma pack(push, 1) // Set packing to 1 byte and push old packing value to stack
class Base
public:
int i;
virtual void Print()cout<<"Base Print";
;
class Derived:public Base
public:
int n;
virtual void Print()cout<<"Derived Print";
;
int main()
Derived d;
cout<<sizeof(Base)<<","<<sizeof(d);
return 0;
#pragma pack(pop) // restore old packing value
6
Note that unless you have a very strong reason for bypassing the alignment rules you probably shouldn't do it.
– Johan
Mar 27 at 11:31
Thank you, it really help me.
– Z.Hc
Mar 27 at 11:39
4
N.B.#pragma pack
is a compiler extension.
– Quentin
Mar 27 at 11:42
add a comment |
This happens due to compiler deciding to align your classes.
If you want (or need) structs or classes to have their "real" sizes, you can use #pragma pack(1)
like this:
#pragma pack(push, 1) // Set packing to 1 byte and push old packing value to stack
class Base
public:
int i;
virtual void Print()cout<<"Base Print";
;
class Derived:public Base
public:
int n;
virtual void Print()cout<<"Derived Print";
;
int main()
Derived d;
cout<<sizeof(Base)<<","<<sizeof(d);
return 0;
#pragma pack(pop) // restore old packing value
6
Note that unless you have a very strong reason for bypassing the alignment rules you probably shouldn't do it.
– Johan
Mar 27 at 11:31
Thank you, it really help me.
– Z.Hc
Mar 27 at 11:39
4
N.B.#pragma pack
is a compiler extension.
– Quentin
Mar 27 at 11:42
add a comment |
This happens due to compiler deciding to align your classes.
If you want (or need) structs or classes to have their "real" sizes, you can use #pragma pack(1)
like this:
#pragma pack(push, 1) // Set packing to 1 byte and push old packing value to stack
class Base
public:
int i;
virtual void Print()cout<<"Base Print";
;
class Derived:public Base
public:
int n;
virtual void Print()cout<<"Derived Print";
;
int main()
Derived d;
cout<<sizeof(Base)<<","<<sizeof(d);
return 0;
#pragma pack(pop) // restore old packing value
This happens due to compiler deciding to align your classes.
If you want (or need) structs or classes to have their "real" sizes, you can use #pragma pack(1)
like this:
#pragma pack(push, 1) // Set packing to 1 byte and push old packing value to stack
class Base
public:
int i;
virtual void Print()cout<<"Base Print";
;
class Derived:public Base
public:
int n;
virtual void Print()cout<<"Derived Print";
;
int main()
Derived d;
cout<<sizeof(Base)<<","<<sizeof(d);
return 0;
#pragma pack(pop) // restore old packing value
answered Mar 27 at 11:27
Egor ShkorovEgor Shkorov
1,6781 gold badge16 silver badges22 bronze badges
1,6781 gold badge16 silver badges22 bronze badges
6
Note that unless you have a very strong reason for bypassing the alignment rules you probably shouldn't do it.
– Johan
Mar 27 at 11:31
Thank you, it really help me.
– Z.Hc
Mar 27 at 11:39
4
N.B.#pragma pack
is a compiler extension.
– Quentin
Mar 27 at 11:42
add a comment |
6
Note that unless you have a very strong reason for bypassing the alignment rules you probably shouldn't do it.
– Johan
Mar 27 at 11:31
Thank you, it really help me.
– Z.Hc
Mar 27 at 11:39
4
N.B.#pragma pack
is a compiler extension.
– Quentin
Mar 27 at 11:42
6
6
Note that unless you have a very strong reason for bypassing the alignment rules you probably shouldn't do it.
– Johan
Mar 27 at 11:31
Note that unless you have a very strong reason for bypassing the alignment rules you probably shouldn't do it.
– Johan
Mar 27 at 11:31
Thank you, it really help me.
– Z.Hc
Mar 27 at 11:39
Thank you, it really help me.
– Z.Hc
Mar 27 at 11:39
4
4
N.B.
#pragma pack
is a compiler extension.– Quentin
Mar 27 at 11:42
N.B.
#pragma pack
is a compiler extension.– Quentin
Mar 27 at 11:42
add a comment |
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%2f55375954%2fwhy-sizeofbase-is-not-different-of-sizeofderived%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
6
Maybe a padding issue?
– schande
Mar 27 at 11:25