Wireshark-dev: Re: [Wireshark-dev] Idle Thought - Compiling with C++
      
      
From: Evan Huus <eapache@xxxxxxxxx>
Date: Thu, 7 Mar 2013 12:28:51 -0500
On Tue, Feb 12, 2013 at 12:01 PM, Evan Huus <eapache@xxxxxxxxx> wrote:
> On Mon, Feb 11, 2013 at 12:26 PM, Evan Huus <eapache@xxxxxxxxx> wrote:
>> On Mon, Feb 11, 2013 at 11:01 AM, Dirk Jagdmann <doj@xxxxxxxxx> wrote:
>>> To me the biggest advantage of transitioning to a C++ compiler is the
>>> availability of std::string and std::list, std::set, std::map. They are so much
>>> more convinient to use than equivalents from the glib or the alternatives
>>> designed for Wireshark. Since the C++ STL classes allow a custom allocator we
>>> can write C++ allocators for our ep_ and se_ (or the new wmem_) paradigms and
>>> typedef Wireshark versions of the STL objects with these allocators. This would
>>> be my biggest immediate benefit.
>>
>> That would be very nice, it's true.
>
> On second thought, and after a little digging into how exactly STL
> allocators work, they don't really support what we are currently doing
> with emem/wmem. Specifically, they would only allow us to bulk-free
> the underlying memory of classes, not bulk-destruct (which is also
> necessary). This is a fairly strong argument that regardless of what
> the API ends up doing, dissector internals should be limited to
> C-style structs.
Just a follow-up to this point. I've dug quite a bit more into the C++
spec and how it defines POD (plain old data) types, and what you're
safely allowed to do with them vs general classes. The short answer is
that C++ POD classes (which are still considerably more powerful than
pure C structs) can be safely handled via a wmem-like allocator in the
usual way, so moving to C++ will win us something here.
Additionally, I've managed to work up a method that will cause a
human-readable compile-time error if the allocator is asked to
allocate for a non-POD class. It uses C++11 features, but they are
ones supported already by both MSVC++ and GCC. It is short so I have
included it for reference:
class base_allocator
{
    public:
        template <typename T>
        T* alloc() {
            static_assert(std::is_pod<T>::value, "cannot allocate
non-POD type");
            return static_cast<T*>(allocate_raw(sizeof(T)));
        }
    private:
        virtual void *allocate_raw(const size_t) = 0;
};
Unfortunately, the STL structures (vector, list, set, map, etc) are
not POD classes, so we still cannot use the STL with memory pools, but
access to POD-class features is still a big win.
Cheers,
Evan
- Prev by Date: Re: [Wireshark-dev] Editcap link warnings
 - Next by Date: Re: [Wireshark-dev] Editcap link warnings
 - Previous by thread: [Wireshark-dev] Wireshark 1.6.14 is now available
 - Next by thread: [Wireshark-dev] [PATCH] tipc: update link header according to spec
 - Index(es):