[cfe-dev] __vector_base::__destruct_at_end
Howard Hinnant
hhinnant at apple.com
Wed Jun 26 09:26:26 PDT 2013
On Jun 26, 2013, at 12:21 PM, Howard Hinnant <hhinnant at apple.com> wrote:
> On Jun 26, 2013, at 11:15 AM, Shriramana Sharma <samjnaa at gmail.com> wrote:
>
>> Hi and thank you very much for your reply.
>>
>> On Wed, Jun 26, 2013 at 8:29 PM, Howard Hinnant <hhinnant at apple.com> wrote:
>>>> void __destruct_at_end(const_pointer __new_last, true_type) _NOEXCEPT;
>>>> __destruct_at_end(const_pointer __new_last, false_type)
>>>
>>> This is an optimization that I found was not working, so I disabled it with the intent of pulling it out completely if the disabilization went well. It has, I'll pull it out.
>>
>> So which of the two will remain? Do I presume the false_type version?
>> (And I presume the true_type/false_type thing is an idiom to avoid
>> creating a differently named delegate function? But a differently
>> named delegate may clarify the purpose of the segregation, no?)
>
> The false_type version will remain, folded into the __destruct_at_end(pointer __new_last). This technique is used to chose among multiple implementations at compile time, without instantiating the unchosen branches.
>
>>
>>>> Also: why separate all the containers into __container and
>>>> __container_base with the former inheriting from the latter? Can't it
>>>> be done in a single class?
>>>
>>> This is a C++03 technique for making container constructors exception safe. Let's look at an example:
>>
>> Wow very nice explanation, thank you very much! I much prefer the
>> try-catch model. Why isn't it then preferred in the libc++
>> implemented? IMO less convoluted, and would avoid lots of base::method
>> calls, no?
>
> In the base class design the clean up code goes in one place: ~base(). In the try-catch design the clean up code gets repeated in each constructor. One could shuffle the clean up code off to a single function, but one still has to replicate the try/catch(...) {clean_up();} for each constructor.
Oh, almost forgot. For the case that client code terminates with an uncaught exception, the base class design leaves a better stack trace on most OS's. If there are no try/catch(...) {throw;} in the unwinding, the stack trace starts from where the exception is thrown, otherwise it starts at the re-throw;.
Howard
More information about the cfe-dev
mailing list