473,386 Members | 1,786 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,386 software developers and data experts.

Implementing a tag pointer class

Hello world,

I'm trying to implement a (hopefully portable!) tagged pointer class.
Basically, I have my own allocator which will ensure alignment at 8-
byte boundaries (where "byte" is "size of a char"), and allocates
objects of type Generic. My tagged pointer class will support either
Generic* (tag = 0b000) or small integers (tag=0b001) for now (in the
future maybe add unicode chars, and/or Cons* etc.).

A rough sketch of what I intend to do:

class Generic;

class Object {
//public for now, will private this and make the
//external functions friends later
public:
union types {
void* ptr;
int num;
};
types dat;

Object(void* x) {
// in case sizeof(void*) != sizeof(int)
if(sizeof(int) sizeof(void*)) {
dat.num = 0;
}
dat.ptr = x;
}
Object(int x) {
if(sizeof(void*) sizeof(int)) {
dat.ptr = 0;
}
dat.num = x;
}

public:
static inline Object smallint(int x) {
x = (x << 3) + 0x1;
return Object(x);
}
static inline Object obj(Generic* x) {
if(x & 0x7) throw AlignmentError();
char* tmp = ((char*)(void*) x) + 0x0;
return Object((void*) tmp);
}
};

static inline char tag(Object x) {
if(sizeof(void*) sizeof(int)) {
return (char)(((long) x.dat.ptr) & 0x7);
} else {
return (char)(x.dat.num & 0x7);
}
}

static inline bool is_smallint(Object x) {
return tag(x) == 0x1;
}
static inline bool is_obj(Object x) {
return tag(x) == 0x0;
}

static inline int as_smallint(Object x) {
if(!is_smallint(x)) throw TypeError();
return x.dat.num >3;
}

static inline Generic* as_obj(Object x) {
if(!is_obj(x)) throw TypeError();
char* tmp = ((char*) x.dat.ptr) - 0x0;
return (Generic*)(void*)tmp;
}

I've tested a version of the above code in a 32-bit x86 GNU/Linux
system with gcc, but I wonder if it's portable, say to big-endian
machines. Also, if optimizations are turned on (-O), it seems to
generate code which approximately looks like what I would expect for
explicit tagged pointers.

I would prefer to use a class-based solution for cleanliness, but I'm
concerned about using unions of potentially differently-sized objects,
especially if the code ends up in a big-endian system with a different
size for pointers and int.

I could also try to dig out the class/type/etc. I saw once which is
supposed to be an integral type that is the same size as the smallest
integer that can fit a void*.

Any pointers and suggestions, as well as analyses on how well this
might perform on various systems/compilers are welcome.

Sincerely,
AmkG
Oct 29 '08 #1
5 3101
alan wrote:
I'm trying to implement a (hopefully portable!) tagged pointer class.
[..]
static inline Object obj(Generic* x) {
if(x & 0x7) throw AlignmentError();
How does this compile? AFAIUI the binary operator & is not defined for
pointer types...
char* tmp = ((char*)(void*) x) + 0x0;
What's the point of adding 0?
return Object((void*) tmp);
}
};
[..]
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Oct 29 '08 #2
Victor Bazarov wrote:
alan wrote:
>I'm trying to implement a (hopefully portable!) tagged pointer class.
[..]
static inline Object obj(Generic* x) {
if(x & 0x7) throw AlignmentError();
Yeah, he might want to cast x to an int
How does this compile? AFAIUI the binary operator & is not defined for
pointer types...
> char* tmp = ((char*)(void*) x) + 0x0;

What's the point of adding 0?
To add: what's point in doing (char*)(void*) ?
Oct 29 '08 #3
On Oct 29, 11:01*pm, Victor Bazarov <v.Abaza...@comAcast.netwrote:
alan wrote:
I'm trying to implement a (hopefully portable!) tagged pointer class.
[..]
* * static inline Object obj(Generic* x) {
* * * * if(x & 0x7) throw AlignmentError();

How does this compile? *AFAIUI the binary operator & is not defined for
pointer types...
Sorry, must have forgot to insert the cast at this point.
>
* * * * char* tmp = ((char*)(void*) x) + 0x0;

What's the point of adding 0?
It's a pattern which I intend to copy for, say, types other than
Generic*. Say Cons*. Or Sym*. The 0x0 is the tag. I can probably
replace the 0x0 with something like:

#define GENERIC_TAG 0x0
#define CONS_TAG 0x2

.....

char* tmp = ((char*)(void*) x) + GENERIC_TAG;

.....

char* tmp = ((char*)(void*) x) + CONS_TAG;

....later on.
>
* * * * return Object((void*) tmp);
* * }
};
[..]

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Oct 29 '08 #4
On Oct 29, 11:01*pm, Victor Bazarov <v.Abaza...@comAcast.netwrote:
alan wrote:
I'm trying to implement a (hopefully portable!) tagged pointer class.
[..]
* * static inline Object obj(Generic* x) {
* * * * if(x & 0x7) throw AlignmentError();

How does this compile? *AFAIUI the binary operator & is not defined for
pointer types...
Yes, I probably want to add a cast there.
>
* * * * char* tmp = ((char*)(void*) x) + 0x0;

What's the point of adding 0?
It's a pattern I want to copy for other types. Say Cons*. Or Sym*.

I could do:

#define GENERIC_TAG 0x0
#define CONS_TAG 0x2

....

char* tmp = ((char*)(void*) x) + GENERIC_TAG;

....

char* tmp = ((char*)(void*) x) + CONS_TAG;
>
* * * * return Object((void*) tmp);
* * }
};
[..]

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Oct 29 '08 #5
On Oct 30, 12:56*am, anon <a...@no.invalidwrote:
Victor Bazarov wrote:
alan wrote:
I'm trying to implement a (hopefully portable!) tagged pointer class.
[..]
* * static inline Object obj(Generic* x) {
* * * * if(x & 0x7) throw AlignmentError();

Yeah, he might want to cast x to an int
How does this compile? *AFAIUI the binary operator & is not defined for
pointer types...
* * * * char* tmp = ((char*)(void*) x) + 0x0;
What's the point of adding 0?

To add: what's point in doing (char*)(void*) ?
Sorry, I wasn't aware of reinterpret_cast at the time.
Oct 29 '08 #6

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: kscho | last post by:
Hi~ i wanna implement like COM interface, but I have problem pass this pointer. How can i pass this pointer in C ? How can i pass this pointer in CPP (thus not occured error)? //_______...
15
by: Bernard | last post by:
Hi All, I am not sure if I should be asking this question on clc or clc++. Let me try on both. I hope that this is not too trivial for the brilliant minds over here. I know that OOP questions...
4
by: mohan | last post by:
Hi All, How to implement virtual concept ( dynamic polymorphism ) in c. I guess i should create a void pointer which is pointing to the function. Not clear about this Does anyone have some idea...
27
by: Pete | last post by:
I'm doing exercise 8-2 from "Accelerated C++" where we're supposed to implement library algorithms, trying to minimize the number of iterator operations. I have two questions so far. First,...
4
by: pat | last post by:
Hi, I have been asked for an exam question to implement the constructor, copy constructor and destructor for the following class that describes an n-by-n matrix containing n squared integer...
4
by: phl | last post by:
hi, My question is: 1. To avoid possible memory leaks, when you use this pattern, after you have dealth with the unmanaged resources and before you take your object off the finalize queue,...
32
by: Abhishek Srivastava | last post by:
Hi, Somebody recently asked me to implement the sizeof operator, i.e. to write a function that accepts a parameter of any type, and without using the sizeof operator, should be able to return...
13
by: Tristan Wibberley | last post by:
Hi I've got implementing overloaded operator new and delete pretty much down. Just got to meet the alignment requirements of the class on which the operator is overloaded. But how does one...
3
by: Daniel Kraft | last post by:
Hi, I usually program in C++, but for a special project I do have to code in C (because it may be ported to embedded-like platforms where no C++ compiler exists). I do want to realize some...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.