4 ms·
> However C++ smart pointers impose a run time performance penalty on your code. i'm not sure if this is the case. unique_ptr doesn't really do much other than
by foxhill 4y ago
> However C++ smart pointers impose a run time performance penalty on your code.
i'm not sure if this is the case. unique_ptr doesn't really do much other than use the type system to ensure that only one instance of the pointed-to value exists at once. as far as i understand, it doesn't strictly do anything at runtime.
- simiones 4y agoI'm honestly not sure: can unique_ptr<T> be used in place of a T* pointing to a stack-allocated object?
- humanrebar 4y agoYes. You can provide a stubbed out deleter or a stack based allocator. But you're then responsible for making sure the unique_ptr doesn't outlive that stack memory. Though that's true for any reference to stack memory.
- rightbyte 4y agounqie_ptr have overhead. It need to run its dtor etc. https://www.youtube.com/watch?v=rHIkrotSwcc https://www.youtube.com/watch?v=rHIkrotSwcc At 18 min.
- adev_ 4y ago> unqie_ptr have overhead. It need to run its dtor etc Technically it is correct, it causes an extremly light overhead due to the inability of the compiler to optimise a part of it. In practice, even in HPC, I never notice it to have an impact ever. And as an advise for any new C++ programmers: Please JUST use unique_ptr, everywhere, all the time... Trying to manage the lifetime manually with new/delete in modern C++ is not worth the cost in 99.99% of the case. If the impact of unique_ptr is noticeable in your program, you are very likely in a realm where you should not even doing memory allocation anyway.
- deleted 4y ago[deleted]
- menaerus 4y agoYou're misinformed. Overhead is not about the running the dtor, unless you're willing to leak the memory in your code regardless of the smart ptr usage or not. What the "overhead" of unique_ptr is usually attached to is the inability for a compiler to pass the unique_ptr as a value through a register but will instead have to use the stack (memory). And that even doesn't apply in the general case but _only_ for unique_ptrs holding an object with non-trivial copy-constructors or non-trivial destructors. This is due to the platform ABI and not the C++ compiler limitation. Anyway, calling that an overhead is a far stretch and almost purely theoretical unless someone is able to measure the negative effect of such code transformation in the real-world codebase. And I say this as not particularly heavy user of smart pointers. Also, many other codegen transformations will not fit into a very limited amount of ABI registers so should we argue about not using those as well? In my opinion, this was only a "campaign" of Google trying to use a unique_ptr as a leverage to persuade the committee to accept their break-the-world ABI suggestion. We know how it all went.
- rightbyte 4y agoAh ok interesting I need to dig into this. Ye well I knew the overhead was really small.
- berkut 4y agoFor unique_ptr, in a release build, no: but in a debug build there's overhead, and more to the point, stepping into the deference in gdb/lldb at least in my experience requires stepping through the internals, to the point some of the code we use with them is #ifdeffed hackily to use raw ptrs in some cases to avoid this annoyance. For shared_ptr, the atomic ref counting can cause surprising overhead due to contention in multi-threaded scenarios, even if just accessing the pointer, depending on how the shared_ptr is passed through functions...
- imron 4y agoThere are settings you can place in .gdbinit to avoid stepping in to internals of anything you don’t want to step into, be it std library classes/functions or your own code. Much nicer than hacky ifdefs.
- exDM69 4y ago> There are settings you can place in .gdbinit to avoid stepping in to internals of anything you don’t want to step into, be it std library classes/functions or your own code. This is exactly what I need. For both, C++ and Rust smart pointers. Can you share any more info on how to set this up?
- imron 4y agoOn mobile at the moment so can’t check my .gdbinit, but a quick search turns up this page which seems relevant: https://sourceware.org/gdb/onlinedocs/gdb/Skipping-Over-Functions-and-Files.html https://sourceware.org/gdb/onlinedocs/gdb/Skipping-Over-Func...