Is it really such a good thing for newNode() to be a macro? - Mailing list pgsql-hackers

From Tom Lane
Subject Is it really such a good thing for newNode() to be a macro?
Date
Msg-id 13079.1219777024@sss.pgh.pa.us
Whole thread Raw
Responses Re: Is it really such a good thing for newNode() to be a macro?  ("Stephen R. van den Berg" <srb@cuci.nl>)
Re: Is it really such a good thing for newNode() to be a macro?  ("Heikki Linnakangas" <heikki@enterprisedb.com>)
List pgsql-hackers
I happened to be looking at nodes.h and started wondering just how
sane this coding really is:

extern PGDLLIMPORT Node *newNodeMacroHolder;

#define newNode(size, tag) \
( \   AssertMacro((size) >= sizeof(Node)),        /* need the tag, at least */ \   newNodeMacroHolder = (Node *)
palloc0fast(size),\   newNodeMacroHolder->type = (tag), \   newNodeMacroHolder \
 
)

Given that we're calling palloc, it's not clear that saving one level of
function call is really buying much; and what it's costing us is a store
to a global variable that the compiler has no way to optimize away.
On a lot of platforms, accessing global variables isn't especially
cheap.  Also, considering that palloc0fast is a nontrivial macro, and
that there are a LOT of uses of newNode(), we're paying rather a lot of
code space for a pretty dubious savings.

So I'm tempted to get rid of this and just make newNode() an out-of-line
function.

Thoughts?
        regards, tom lane


pgsql-hackers by date:

Previous
From: Josh Berkus
Date:
Subject: September Commit Fest coming soon!
Next
From: "Brendan Jurd"
Date:
Subject: Re: Split up the wiki TODO page?