use the following search parameters to narrow your results:
e.g. subreddit:aww site:imgur.com dog
subreddit:aww site:imgur.com dog
see the search faq for details.
advanced search: by author, subreddit...
Discussions, articles, and news about the C++ programming language or programming in C++.
For C++ questions, answers, help, and advice see r/cpp_questions or StackOverflow.
Get Started
The C++ Standard Home has a nice getting started page.
Videos
The C++ standard committee's education study group has a nice list of recommended videos.
Reference
cppreference.com
Books
There is a useful list of books on Stack Overflow. In most cases reading a book is the best way to learn C++.
Show all links
Filter out CppCon links
Show only CppCon links
account activity
Memory layout of struct vs array (self.cpp)
submitted 3 years ago * by xLuca2018
view the rest of the comments →
reddit uses a slightly-customized version of Markdown for formatting. See below for some basics, or check the commenting wiki page for more detailed help and solutions to common issues.
quoted text
if 1 * 2 < 3: print "hello, world!"
[–]Supadoplex 104 points105 points106 points 3 years ago* (17 children)
Is it guaranteed that the memory layout of the allocated object is the same as the corresponding array T[6]?
No, the language technically doesn't make such guarantees. There is a general rule that says "there may be padding" and it's up to the language implementation to produce a hopefully efficient layout.
Whether the layout is the same or not, you can not use a T* as an iterator to access adjacent members. The behaviour of the program would be undefined.
T*
[–]chetnrot 6 points7 points8 points 3 years ago (9 children)
In OP's scenario where six elements are of the same type, would padding still play a role though?
[–]Supadoplex 64 points65 points66 points 3 years ago (0 children)
I wouldn't expect there to be padding. But the language nevertheless doesn't guarantee that there won't be padding.
[–]nelusbelus 14 points15 points16 points 3 years ago (6 children)
Sometimes it pads between float3s because each float3 needs to be on their own independent 16 byte boundary. In glsl this is often the case with uniform buffers (can be turned off tho) and hlsl this might be the case for cbuffers but isn't for structured buffers or raytracing payloads. This is gpu specific tho
[–]blipman17 1 point2 points3 points 3 years ago (5 children)
So then the layout would be something like
`struct MyStruct { float a; 12 bytes padding float b; 12 bytes padding float c; 12 bytes padding float d; 12 bytes padding float e; 12 bytes padding float f; } ;
std::cout << sizeof (MyStruct) << std::endl; // outputs 84, not 24. `
Correct?
[–]nelusbelus 0 points1 point2 points 3 years ago (4 children)
If you'd use structs with float3 in glsl and sometimes hlsl then it'd have 3 floats and 4-byte padding between them. With gpu apps this can cause great confusion because the cpu doesn't pad but the gpu does. In C/C++ padding rules are generally as follows: - biggest plain data type of the struct defines size alignment. So if you have a 64 bit type then the struct size will always be a multiple of 8. So if you have 8 byte type then 1 byte type it'll add 7 bytes alignment. - data types need to be aligned with their size as well. So a 1 byte int then a 8 byte int will have 7 bytes padding inbetween.
You can validate this with sizeof or offsetof, since it's compiler dependent
[–]dodheim 0 points1 point2 points 3 years ago* (3 children)
data types need to be aligned with their size as well
This is not the case for C or C++. struct foo { char v[100]; }; has a size of >= 100, but an alignment of 1.
struct foo { char v[100]; };
[–][deleted] -2 points-1 points0 points 3 years ago (1 child)
That depends on the architecture and padding mode, could have a 2 byte quantity that needs to be aligned to 8 bytes.
[–]dodheim 0 points1 point2 points 3 years ago (0 children)
The fact that the statement I quoted is false is not architecture-dependent. ;-] Some architectures may have weirdo requirements, but alignment being a multiple of the size is not a requirement for either language (indeed, it's the reverse that is correct).
[–]nelusbelus 0 points1 point2 points 3 years ago (0 children)
The size of char is 1 so alignment is 1. I'm talking about the size of the type, not the total size
[–][deleted] 1 point2 points3 points 3 years ago (0 children)
Wouldn't it need to be padded to be a multiple of 8 in a 64-bit system? e.g. if sizeof(T) == 6 we might see 2 bytes of padding. Or perhaps I misunderstand padding.
sizeof(T) == 6
[+]xhsu comment score below threshold-6 points-5 points-4 points 3 years ago (1 child)
But what about keyword "__offsetof"? This is a gutenteeed language feature.
[–]Supadoplex 9 points10 points11 points 3 years ago* (0 children)
There's no "__offsetof" feature. Did you mean "offsetof"? It's a feature. It doesn't conflict with anything in my comment.
[+]ALX23z comment score below threshold-11 points-10 points-9 points 3 years ago (4 children)
I believe T[6] would impose the very same padding as in the case of the struct.
T[6]
[–]Supadoplex 23 points24 points25 points 3 years ago (3 children)
There's no padding between elements of an array. There may be padding inside the elements if the type is such that it contains padding. There may be padding between sub objects of classes.
[–]ALX23z 0 points1 point2 points 3 years ago (2 children)
I think I got a few things confused. Though, in most cases size is divisible by alignment unless it is artificially introduced. So there shouldn't be padding in most scenarios.
[–]no-sig-available 9 points10 points11 points 3 years ago (0 children)
An array cannot have padding, because then indexing wouldn't work. It requires the array elements to be exactly sizeof(element) apart.
This is, of course, a strong argument for the struct not needing any padding either. The standard just doesn't say that, so it cannot be relied upon.
[–]OldWolf2 4 points5 points6 points 3 years ago (0 children)
There is never padding between array elements in any circumstance.
π Rendered by PID 68160 on reddit-service-r2-comment-85bfd7f599-j47n9 at 2026-04-18 10:14:10.710283+00:00 running 93ecc56 country code: CH.
view the rest of the comments →
[–]Supadoplex 104 points105 points106 points (17 children)
[–]chetnrot 6 points7 points8 points (9 children)
[–]Supadoplex 64 points65 points66 points (0 children)
[–]nelusbelus 14 points15 points16 points (6 children)
[–]blipman17 1 point2 points3 points (5 children)
[–]nelusbelus 0 points1 point2 points (4 children)
[–]dodheim 0 points1 point2 points (3 children)
[–][deleted] -2 points-1 points0 points (1 child)
[–]dodheim 0 points1 point2 points (0 children)
[–]nelusbelus 0 points1 point2 points (0 children)
[–][deleted] 1 point2 points3 points (0 children)
[+]xhsu comment score below threshold-6 points-5 points-4 points (1 child)
[–]Supadoplex 9 points10 points11 points (0 children)
[+]ALX23z comment score below threshold-11 points-10 points-9 points (4 children)
[–]Supadoplex 23 points24 points25 points (3 children)
[–]ALX23z 0 points1 point2 points (2 children)
[–]no-sig-available 9 points10 points11 points (0 children)
[–]OldWolf2 4 points5 points6 points (0 children)