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;








4















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










share|improve this question





















  • 6





    Maybe a padding issue?

    – schande
    Mar 27 at 11:25

















4















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










share|improve this question





















  • 6





    Maybe a padding issue?

    – schande
    Mar 27 at 11:25













4












4








4


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










share|improve this question
















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






share|improve this question















share|improve this question













share|improve this question




share|improve this question








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












  • 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












2 Answers
2






active

oldest

votes


















8















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)





share|improve this answer






















  • 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


















1














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





share|improve this answer




















  • 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













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
);



);













draft saved

draft discarded


















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









8















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)





share|improve this answer






















  • 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















8















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)





share|improve this answer






















  • 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













8












8








8








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)





share|improve this answer
















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)






share|improve this answer














share|improve this answer



share|improve this answer








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, 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












  • 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







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













1














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





share|improve this answer




















  • 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















1














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





share|improve this answer




















  • 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













1












1








1







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





share|improve this answer













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






share|improve this answer












share|improve this answer



share|improve this answer










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












  • 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

















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.




draft saved


draft discarded














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





















































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







Popular posts from this blog

Kamusi Yaliyomo Aina za kamusi | Muundo wa kamusi | Faida za kamusi | Dhima ya picha katika kamusi | Marejeo | Tazama pia | Viungo vya nje | UrambazajiKuhusu kamusiGo-SwahiliWiki-KamusiKamusi ya Kiswahili na Kiingerezakuihariri na kuongeza habari

SQL error code 1064 with creating Laravel foreign keysForeign key constraints: When to use ON UPDATE and ON DELETEDropping column with foreign key Laravel error: General error: 1025 Error on renameLaravel SQL Can't create tableLaravel Migration foreign key errorLaravel php artisan migrate:refresh giving a syntax errorSQLSTATE[42S01]: Base table or view already exists or Base table or view already exists: 1050 Tableerror in migrating laravel file to xampp serverSyntax error or access violation: 1064:syntax to use near 'unsigned not null, modelName varchar(191) not null, title varchar(191) not nLaravel cannot create new table field in mysqlLaravel 5.7:Last migration creates table but is not registered in the migration table

은진 송씨 목차 역사 본관 분파 인물 조선 왕실과의 인척 관계 집성촌 항렬자 인구 같이 보기 각주 둘러보기 메뉴은진 송씨세종실록 149권, 지리지 충청도 공주목 은진현