On Thursday, 25 September 2014 at 05:46:35 UTC, Walter Bright wrote:
On 9/24/2014 1:15 PM, Manu via Digitalmars-d wrote:
Something like (whatever syntax you like):

int^ rcInt; // refcounted pointer to an int
MyStruct^ rcStruct; // refcounted pointer to a struct
MyStruct s; // normal value-type struct, but if the struct has
opInc/opDec, the RC handling code in the compiler can implicitly generate calls to opInc/opDec on assignment, which will allow the
struct to manage itself.

I think Microsoft's C++/CLI tried that mixed pointer approach, and it was a disaster. I don't have personal knowledge of this.

I suspect I know why. C++ on DOS had mixed pointer types - the near and far thing. It was simply unworkable in C++. Sure, it technically worked, but was so awful trying to deal with "is my ref type near or far" that people just couldn't write comprehensible code with it.

Note that a ^ pointer will be a different size than a * pointer. Things go downhill from there.

Why it was a disaster? Microsoft is still using it.

It is how C++/CX works, recently introduced with Windows 8 new COM based runtime.

The different to C++/CLI being that ^ (handle types) are not GC pointers, but rather compiler managed COM (AddRef/Release) instances.

For those that wish to stay away from C++/CX, there is the more complex Windows Runtime C++ Template Library with ComPtr<>(), but then bye compiler support for increment/decrement removals.

http://msdn.microsoft.com/en-us/library/hh699870.aspx

http://msdn.microsoft.com/en-us/library/windows/apps/jj822931.aspx

Example for those lazy to follow the link,

using namespace Platform;

Person^ p = ref new Person("Clark Kent");
p->AddPhoneNumber("Home", "425-555-4567");
p->AddPhoneNumber("Work", "206-555-9999");
String^ workphone = p->PhoneNumbers->Lookup("Work");



--
Paulo

Reply via email to