>> > change this code: >> > typedef struct NiuRoutingStruct { >> > sqlite3_vtab vtab; >> > } NiuRouting; >> > to this: >> > struct NiuRouting : public sqlite3_vtab vtab { >> > ... // your implementation, eventually >> > }; >> > >> > This way, the casting is unnecessary and any pointer offsetting will >> be >> > done correctly. >> >> Just for my curiosity: >> Is the above really equivalent to the C definition like: >> typedef struct NiuRoutingStruct { >> sqlite3_vtab vtab; >> ... // your implementation, eventually >> } NiuRouting; >> >> ? >> >> Reason I'm asking: sqlite uses a pointer to that structure to access >> "sqlite3_vtab vtab" member - in machine code that would be >> memory offset 0, all other private members start at >> +sizeof(sqlite3_vtab)+optional alignment. >> Now, I'm wondering if a c++ style of inheritance is defined >> in the same way - Note that sqlite relies on that, or better >> say "the compiler that produced the sqlite machine code relies >> on that". >> Just in case the c++ compiler rearrange the byte offset differently >> it will crash rights away, I think. >> >> Thanks. > > Without my copy/paste error, (the 'vtab' should be gone, leaving just the > struct name), it would be equivalent provided that the alignment of a > sqlite3_vtab was no less restrictive than the alignment of > NiuRoutingStruct as it is finally defined. However, static_casting from > derived to base automatically incorporates the correct offset, (as would > taking the address of an embedded sqlite3_vtab member, instead of using > the OP's reinterpret cast), so the crash you worry about (with good > reason) would be made less likely.
okay, thank you for the explanation. Interesting subject. Kind regards Marcus > > I think all SQLite relies upon is getting correct pointers to its portion > of whatever object it is passing around. That virtual table API is > designed to make it agnostic as to any other, tag-along content. > > Best regards, > -- > Larry Brasfield > > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users