git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 4/5] diff_filespec: reorder is_binary field

From
Jeff King <peff@peff.net>
Date
Jan 17, 2014, 01:22 UTC
Message-ID
<20140117012255.GD7249@sigill.intra.peff.net>
In-Reply-To
<20140117011844.GA6870@sigill.intra.peff.net>

The middle of the diff_filespec struct contains a mixture of ints, shorts, and bit-fields, followed by a pointer. On an x86-64 system with an LP64 or LLP64 data model (i.e., most of them), the integers and flags end up being padded out by 41 bits to put the pointer at an 8-byte boundary.

After the pointer, we have the "int is_binary" field, which is only 32 bits. We end up wasting another 32 bits to pad the struct size up to a multiple of 64 bits.

We can move the is_binary field before the pointer, which lets the compiler store it where we used to have padding. This shrinks the top padding to only 9 bits (from the bit-fields), and eliminates the bottom padding entirely, dropping the struct size from 88 to 80 bytes.

On a 32-bit system, there is no benefit, but nor should there be any harm (we only need 4-byte alignment there, so we were already using only 9 bits of padding).

Signed-off-by: Jeff King <peff@peff.net>
---
 diffcore.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/diffcore.h b/diffcore.h
index 22993e1..d911bf0 100644
--- a/diffcore.h
+++ b/diffcore.h
@@ -45,9 +45,9 @@ struct diff_filespec {
 #define DIRTY_SUBMODULE_MODIFIED  2
 	unsigned is_stdin : 1;
 	unsigned has_more_entries : 1; /* only appear in combined diff */
-	struct userdiff_driver *driver;
 	/* data should be considered "binary"; -1 means "don't know yet" */
 	int is_binary;
+	struct userdiff_driver *driver;
 };
 
 extern struct diff_filespec *alloc_filespec(const char *);
-- 
1.8.5.2.500.g8060133
Previous: Jeff KingNext: Jeff King
Message 8 of 10 in “diff_filespec cleanups and optimizations”
  1. 0/5 diff_filespec cleanups and optimizationsJeff King, Jan 17, 2014
  2. 1/5 diff_filespec: reorder dirty_submodule macro definitionsJeff King, Jan 17, 2014
  3. Junio C HamanoJan 17, 2014
  4. Jeff KingJan 17, 2014
  5. Junio C HamanoJan 17, 2014
  6. 2/5 diff_filespec: drop funcname_pattern_ident fieldJeff King, Jan 17, 2014
  7. 3/5 diff_filespec: drop xfrm_flags fieldJeff King, Jan 17, 2014
  8. 4/5 diff_filespec: reorder is_binary fieldJeff King, Jan 17, 2014
  9. 5/5 diff_filespec: use only 2 bits for is_binary flagJeff King, Jan 17, 2014
  10. Junio C HamanoJan 17, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.