[hackers] [sbase] Remove bit fields || Roberto E. Vargas Caballero

From: <git_AT_suckless.org>
Date: Fri, 20 Feb 2015 14:48:26 +0100 (CET)

commit 812234f9f1816541ea718d97a9275bf5467771a2
Author: Roberto E. Vargas Caballero <k0ga_AT_shike2.com>
Date: Fri Feb 20 14:38:52 2015 +0100

    Remove bit fields
    
    Before removing bit fields:
    
    $ size find
    
       text data bss dec hex filename
    
      16751 968 48 17767 4567 find
    
    After removing bit fields:
    $ size find
       text data bss dec hex filename
      16527 968 68 17563 449b find
    
    This is an example where bit fields uses more memory
    than integers or char. There is going to be only one
    gflags struct, so the waste in instructions is bigger
    than the space saved by bit fields. In the case of Permarg,
    Sizearg, Execarg there is only one bit field, so at least
    one unsigned is used, so there is no any gain.

diff --git a/find.c b/find.c
index 4f8084a..bbdf98e 100644
--- a/find.c
+++ b/find.c
_AT_@ -64,7 +64,7 @@ struct Tok {
 /* structures used for Arg.extra.p and Tok.extra.p */
 typedef struct {
         mode_t mode;
- unsigned int exact:1;
+ unsigned char exact;
 } Permarg;
 
 typedef struct {
_AT_@ -83,7 +83,7 @@ typedef struct {
 
 typedef struct {
         Narg n;
- unsigned int bytes:1; /* size is in bytes, not 512 byte sectors */
+ unsigned char bytes; /* size is in bytes, not 512 byte sectors */
 } Sizearg;
 
 typedef struct {
_AT_@ -100,7 +100,7 @@ typedef struct {
                 } p; /* plus */
         } u;
         char **argv; /* NULL terminated list of arguments (allocated if isplus) */
- unsigned int isplus:1; /* -exec + instead of -exec ; */
+ unsigned char isplus; /* -exec + instead of -exec ; */
 } Execarg;
 
 /* used to find loops while recursing through directory structure */
_AT_@ -221,14 +221,14 @@ size_t envlen; /* number of bytes in environ, used to calculate against ARG_MAX
 size_t argmax; /* value of ARG_MAX retrieved using sysconf(3p) */
 
 struct {
- unsigned ret :1; /* return value from main */
- unsigned depth:1; /* -depth, directory contents before directory itself */
- unsigned h :1; /* -H, follow symlinks on command line */
- unsigned l :1; /* -L, follow all symlinks (command line and search) */
- unsigned prune:1; /* hit -prune, eval should return STW_PRUNE (return values
+ unsigned ret ; /* return value from main */
+ unsigned depth; /* -depth, directory contents before directory itself */
+ unsigned h ; /* -H, follow symlinks on command line */
+ unsigned l ; /* -L, follow all symlinks (command line and search) */
+ unsigned prune; /* hit -prune, eval should return STW_PRUNE (return values
                                                  traversing expression tree are boolean so we can't
                                                  easily return this. instead set a global flag) */
- unsigned xdev :1; /* -xdev, prune directories on different devices */
+ unsigned xdev ; /* -xdev, prune directories on different devices */
 } gflags;
 
 /*
Received on Fri Feb 20 2015 - 14:48:26 CET

This archive was generated by hypermail 2.3.0 : Fri Feb 20 2015 - 15:00:15 CET