Developer knowledge network ยท moderated exchange

Komunitas Kode Tidak Dapat Diandalkan

Riset Pengembang, Rekayasa Terbalik & Komunitas Pengkodean

Knowledge indexHidup
4Categories
919Threads
2.8KPostingan
Guide

Understanding std::unique_ptr custom deleters: function pointers vs lambda stateless deleters [StackOverflow Architecture Guide]

raii_clean_coder
Modern C++ Advocate
MEMBER
Reputasi: 190
Tanggal Bergabung: Aug 2020
Postingan: 20
Terima kasih: 22
1 bulan yang lalu ยท Jul 5, 2026 7:24 PM
#1

Why specifying a custom deleter in std::unique_ptr changes its memory size:

  1. Stateless Struct Deleter:
CPP
   struct FreeDeleter { void operator()(void* p) const { std::free(p); } };
   std::unique_ptr<int, FreeDeleter> p(ptr);
   // sizeof(p) == 8 bytes (Empty Base Optimization / [[no_unique_address]])!
  1. Function Pointer Deleter:
CPP
   std::unique_ptr<FILE, decltype(&fclose)> f(fp, &fclose);
   // sizeof(f) == 16 bytes! (Stores an extra 8-byte function pointer inside the smart pointer object!)
modern_cpp_artisan
C++ Template Wizard
MEMBER
Reputasi: 124
Tanggal Bergabung: Jun 2019
Postingan: 29
Terima kasih: 72
1 bulan yang lalu ยท Jul 5, 2026 10:40 PM
#2

Always prefer a stateless functor or empty struct deleter over raw function pointers to keep std::unique_ptr exactly 8 bytes.

memory_model_mook
Low-Level C Veteran
MEMBER
Reputasi: 163
Tanggal Bergabung: Jan 2019
Postingan: 11
Terima kasih: 33
1 bulan yang lalu ยท Jul 6, 2026 1:34 PM
#3

Great tip. Keeping unique_ptr at 8 bytes means it passes in a single CPU register (rdi/rcx) under standard calling conventions.