|
Boost Users : |
From: Zeljko Vrba (zvrba.nospam_at_[hidden])
Date: 2007-06-04 15:30:43
On Mon, Jun 04, 2007 at 08:54:03PM +0200, Ion Gaztañaga wrote:
>
> I'm a bit puzzled, because it seems odd that the hook is not aligned to
> 4 bytes even if you have a char between data and the hook. The compiler
> might be reordering things a bit.
>
No, the data stored in the pointer-to-member is *not* the "real" offset,
contrary to your assumption :) When checking in the debugger, the hook
is aligned properly.
>
> Could you check the real distance between klass and hook_? Something like:
>
The statement (after adding 'klass k' in the local scope of main())
cout << (char*)&k.hook_ - (char*)&k << endl;
prints out 84.
Furthermore, given the following program:
==
#include <boost/intrusive/list.hpp>
struct klass {
void *data_klass[10];
boost::intrusive::list_member_hook<> hook_;
typedef boost::intrusive::list<
boost::intrusive::list_member_hook<>::value_traits<
klass, &klass::hook_>,
false> list;
};
static klass Gd;
static klass::list Gl;
int main(void)
{
Gl.push_back(Gd);
return 0;
}
==
I step the execution to list::push_back and its first statement
node_ptr to_insert = ValueTraits::to_node_ptr(value);
The debugger reports:
(dbx) print -r *to_insert
*to_insert = {
node::prev_ = (nil)
node::next_ = (nil)
}
(dbx) p to_insert
to_insert = 0x8062e2c
(dbx) up
Current function is main
19 Gl.push_back(Gd);
(dbx) p &Gd
&Gd = 0x8062e2c
So, the "to_insert" does not point to the hook address, but to the very
beginning of the structure.
BTW, this is with SunStudio 12: CC: Sun C++ 5.9 SunOS_i386 2007/05/03
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net