Karsten Blees wrote:

> (Besides, __attribute__((aligned)) / __declspec(align) can only
> _increase_ the alignment, so aligned(1) would have no effect).

Good catch.

> 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
 #end

Then you can do:

 BEGIN_PACKED
 struct hashmap_entry {
        ...
 };
 END_PACKED

Whether that's nicer or uglier than the alternatives I leave to you.
;-)

Thanks,
Jonathan
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to