https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91043
--- Comment #24 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to Richard Biener from comment #23) > (In reply to Hanoch Haim from comment #22) > > > > "Of course it does, because without aligning the container you cannot have > > aligned members. Maximum alignment always propagates outwards." > > > > Sorry, your answer is still not clear, so let give a short example > > In this case there is a discrepancy betwean two gcc modules > > > > 1. The module that generates the code think that it is aligned > > (CCPortLatency) > > 2. However the linker puts it in a none aligned location > > > > > > " > > class CTimeHistogram { > > > > } __rte_cache_aligned; > > > > class CCPortLatency { > > public: > > CTimeHistogram m_hist; > > }; > > class Root { > > > > CCPortLatency port; > > > > } __rte_cache_aligned; > > > > static Root root; > > " > > > > In this case can I expect root.port to be aligned because its child (m_hist) > > was defined as aligned and it propogate? Or should I explicitly ask both to > > be aligned? > > Yes, for > > class CTimeHistogram { > } __attribute__((aligned(64))); > class CCPortLatency { > public: > CTimeHistogram m_hist; > }; > class Root { > CCPortLatency port; > }; > static Root root; > > 'root' will be aligned to 64 bytes. This is also what you can easily > observe when inspecting the ELF object: > > Section Headers: > [Nr] Name Type Address Offset > Size EntSize Flags Link Info Align > ... > [ 3] .bss NOBITS 0000000000000000 00000040 > 0000000000000040 0000000000000000 WA 0 0 64 > > Symbol table '.symtab' contains 8 entries: > Num: Value Size Type Bind Vis Ndx Name > ... > 5: 0000000000000000 64 OBJECT LOCAL DEFAULT 3 _ZL4root > > compiled without optimization since root is unused and will otherwise > be eliminated. You can also check with static_assert (__alignof__(root.port.m_hist) == 64, "oops"); (need to make port public for this, eh)