digitalmars.D.learn - Is the memory address of classinfo the same for all instances of a class?
- Heywood Floyd (15/15) Jul 02 2010 Good day!
- Steven Schveighoffer (11/26) Jul 02 2010 Use classinfo.name. The classinfo is the same memory address in the sam...
- Steven Schveighoffer (5/37) Jul 02 2010 Duh, just realized, classinfos should use this same method to compare. ...
- Heywood Floyd (36/68) Jul 02 2010 wrote:
- Simen kjaeraas (9/21) Jul 02 2010 Have you profiled your code and found that comparing classinfo is a
- Gareth Charnock (6/53) Jul 15 2010 Would simply comparing slices such as classtype.name[10..$] work? Or if
Good day! Consider // - - - - class Foo{} auto one = new Foo(); auto two = new Foo(); writefln("one: %x two: %x", &one.classinfo, &two.classinfo); // - - - - For me this results in two identical memory addresses "every time". Can I rely on this? Can I design software based on the assumption that these addresses are always the same? (I'd like to be able to use the memory address as the key in an associative array, for quick by-class lookups.) BR /heywood
Jul 02 2010
On Fri, 02 Jul 2010 09:24:20 -0400, Heywood Floyd <soul8o8 gmail.com> wrote:Good day! Consider // - - - - class Foo{} auto one = new Foo(); auto two = new Foo(); writefln("one: %x two: %x", &one.classinfo, &two.classinfo); // - - - - For me this results in two identical memory addresses "every time". Can I rely on this? Can I design software based on the assumption that these addresses are always the same? (I'd like to be able to use the memory address as the key in an associative array, for quick by-class lookups.)Use classinfo.name. The classinfo is the same memory address in the same executable/dynamic library. If you open another D dynamic library, the classinfo address for the same class may be different, but the name will be the same. Note that comparing classinfo.names will be just as fast as comparing classinfo addresses if the names are at the same address (which will be true if the classinfo is at the same address) because the string comparison function short-circuits if the addresses are the same. -Steve
Jul 02 2010
On Fri, 02 Jul 2010 09:32:39 -0400, Steven Schveighoffer <schveiguy yahoo.com> wrote:On Fri, 02 Jul 2010 09:24:20 -0400, Heywood Floyd <soul8o8 gmail.com> wrote:Duh, just realized, classinfos should use this same method to compare. Just use the whole class info as the key, don't take the address. -SteveGood day! Consider // - - - - class Foo{} auto one = new Foo(); auto two = new Foo(); writefln("one: %x two: %x", &one.classinfo, &two.classinfo); // - - - - For me this results in two identical memory addresses "every time". Can I rely on this? Can I design software based on the assumption that these addresses are always the same? (I'd like to be able to use the memory address as the key in an associative array, for quick by-class lookups.)Use classinfo.name. The classinfo is the same memory address in the same executable/dynamic library. If you open another D dynamic library, the classinfo address for the same class may be different, but the name will be the same. Note that comparing classinfo.names will be just as fast as comparing classinfo addresses if the names are at the same address (which will be true if the classinfo is at the same address) because the string comparison function short-circuits if the addresses are the same.
Jul 02 2010
On Jul 2, 2010, at 15:34 , Steven Schveighoffer wrote:On Fri, 02 Jul 2010 09:32:39 -0400, Steven Schveighoffer =<schveiguy yahoo.com> wrote:=20wrote:On Fri, 02 Jul 2010 09:24:20 -0400, Heywood Floyd <soul8o8 gmail.com> =are always the same?=20=20 Good day! =20 =20 Consider =20 // - - - - class Foo{} auto one =3D new Foo(); auto two =3D new Foo(); writefln("one: %x two: %x", &one.classinfo, &two.classinfo); // - - - - =20 For me this results in two identical memory addresses "every time". =20 Can I rely on this? Can I design software based on the assumption that these addresses =associative array, for quick by-class=20 (I'd like to be able to use the memory address as the key in an =same executable/dynamic library. If you open another D dynamic library, = the classinfo address for the same class may be different, but the name = will be the same.lookups.)=20 Use classinfo.name. The classinfo is the same memory address in the =classinfo addresses if the names are at the same address (which will be = true if the classinfo is at the same address) because the string = comparison function short-circuits if the addresses are the same.=20 Note that comparing classinfo.names will be just as fast as comparing ==20 Duh, just realized, classinfos should use this same method to compare. =Just use the whole class info as the key, don't take the address.=20 -SteveAlright thanks! Ok, loading in code dynamically changes the addresses. Good point. = Thanks! I looked up the TypeInfo_Class-implementation and it seems to compare = class names. So that looks good. Will use the classinfos directly like = you suggested. Seems proper. *** Hm, but still, I can't quite let go of this. Even if the string comparer can short-circuit, it still has to go = through strings that are _not_ of the same address untill it spots a = difference, as they could potentially be equal anyway? I noted that the classinfo.name-strings typically looks like this: classtype.Foo classtype.Bar classtype.Cat classtype.Dog Doesn't this first "classtype."-part introduce overhead when these = strings are used as keys in an AA? The string comparer more or less = always have to check the first 10 chars, which are equal for all. (I = know I'm being picky here. But the whole using memory addresses-thing = came from the fear of string comparisons being suboptimal.) /heywood (PS. Feature-request: move the "classtype."-part of classinfo names to = the end ; )
Jul 02 2010
Heywood Floyd <soul8o8 gmail.com> wrote:I noted that the classinfo.name-strings typically looks like this: classtype.Foo classtype.Bar classtype.Cat classtype.Dog Doesn't this first "classtype."-part introduce overhead when these strings are used as keys in an AA? The string comparer more or less always have to check the first 10 chars, which are equal for all. (I know I'm being picky here. But the whole using memory addresses-thing came from the fear of string comparisons being suboptimal.)Have you profiled your code and found that comparing classinfo is a bottleneck? If it is, have you considered a two-layer system? i.e. foo[transmutedClassInfo], where transmutedClassInfo is the result of another lookup, that is based purely on the pointer to the classInfo?(PS. Feature-request: move the "classtype."-part of classinfo names to the end ; )I find it unlikely that will ever happen. The classinfo name should be the same as the FQN of the class. -- Simen
Jul 02 2010
On 02/07/10 15:18, Heywood Floyd wrote:On Jul 2, 2010, at 15:34 , Steven Schveighoffer wrote:Would simply comparing slices such as classtype.name[10..$] work? Or if you're not sure about classtype always being present every single time (I don't know if it is), perhaps write a compile time function that takes a string and appends a simple string checksum to the front? Then swap classinfo.name for f(classinfo.name).On Fri, 02 Jul 2010 09:32:39 -0400, Steven Schveighoffer<schveiguy yahoo.com> wrote:Alright thanks! Ok, loading in code dynamically changes the addresses. Good point. Thanks! I looked up the TypeInfo_Class-implementation and it seems to compare class names. So that looks good. Will use the classinfos directly like you suggested. Seems proper. *** Hm, but still, I can't quite let go of this. Even if the string comparer can short-circuit, it still has to go through strings that are _not_ of the same address untill it spots a difference, as they could potentially be equal anyway? I noted that the classinfo.name-strings typically looks like this: classtype.Foo classtype.Bar classtype.Cat classtype.Dog Doesn't this first "classtype."-part introduce overhead when these strings are used as keys in an AA? The string comparer more or less always have to check the first 10 chars, which are equal for all. (I know I'm being picky here. But the whole using memory addresses-thing came from the fear of string comparisons being suboptimal.) /heywood (PS. Feature-request: move the "classtype."-part of classinfo names to the end ; )On Fri, 02 Jul 2010 09:24:20 -0400, Heywood Floyd<soul8o8 gmail.com> wrote:Duh, just realized, classinfos should use this same method to compare. Just use the whole class info as the key, don't take the address. -SteveGood day! Consider // - - - - class Foo{} auto one = new Foo(); auto two = new Foo(); writefln("one: %x two: %x",&one.classinfo,&two.classinfo); // - - - - For me this results in two identical memory addresses "every time". Can I rely on this? Can I design software based on the assumption that these addresses are always the same? (I'd like to be able to use the memory address as the key in an associative array, for quick by-class lookups.)Use classinfo.name. The classinfo is the same memory address in the same executable/dynamic library. If you open another D dynamic library, the classinfo address for the same class may be different, but the name will be the same. Note that comparing classinfo.names will be just as fast as comparing classinfo addresses if the names are at the same address (which will be true if the classinfo is at the same address) because the string comparison function short-circuits if the addresses are the same.
Jul 15 2010