| From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> | 
|---|---|
| To: | pgsql-hackers(at)postgreSQL(dot)org | 
| Subject: | Is it really such a good thing for newNode() to be a macro? | 
| Date: | 2008-08-26 18:57:04 | 
| Message-ID: | 13079.1219777024@sss.pgh.pa.us | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | 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
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Brendan Jurd | 2008-08-26 19:01:26 | Re: Split up the wiki TODO page? | 
| Previous Message | Josh Berkus | 2008-08-26 18:28:11 | September Commit Fest coming soon! |