Re: What's cooking in git.git (Dec 2013, #02; Fri, 6)
- From
Jonathan Nieder <jrnieder@gmail.com>
- Date
- Dec 9, 2013, 23:45 UTC
- Message-ID
- <20131209234500.GY29959@google.com>
- In-Reply-To
- <52A64FE9.5010004@gmail.com>
Karsten Blees wrote:
> (Besides, __attribute__((aligned)) / __declspec(align) can only > _increase_ the alignment, so aligned(1) would have no effect).
Good catch.
Show 15 quoted lines
> Googling some more, I believe the most protable way to achieve this
> via 'compiler settings' is
>
> #pragma pack(push)
> #pragma pack(4)
> struct hashmap_entry {
> struct hashmap_entry *next;
> unsigned int hash;
> };
> #pragma pack(pop)
>
> This is supported by at least GCC, MSVC and HP (see your link). The
> downside is that we cannot use macros (in git-compat-util.h) to emit
> #pragmas. But we wouldn't have to, as compilers aren't supposed to
> barf on unknown #pragmas.Technically this can be done using macros:
#if (gcc)
# define BEGIN_PACKED _Pragma("pack(push,4)")
# define END_PACKED _Pragma("pack(pop)")
#elif (msvc)
# define BEGIN_PACKED __pragma(pack(push,4))
# define END_PACKED __pragma(pack(pop))
#else
/* Just tolerate a little padding. */
# define BEGIN_PACKED
# define END_PACKED
#endThen you can do:
BEGIN_PACKED
struct hashmap_entry {
...
};
END_PACKEDWhether that's nicer or uglier than the alternatives I leave to you. ;-)
Thanks, Jonathan