[gdal-dev] Starting a discussion on style and coding guidelines

Andrew Bell andrew.bell.ia at gmail.com
Thu May 5 13:56:34 PDT 2016

On Thu, May 5, 2016 at 10:19 AM, Kurt Schwehr <schwehr at gmail.com> wrote:

> Thanks all for your comments!  I will try to write up a similar proposal
> for C++11 based on what people have written.
> This local stack storage change is for a real need, so it's probably good
> that I add a use case that explains why this change is important.  And I
> >>believe<< (but am not 100% sure) that using std::vector is the strongest
> solution for the majority of instances of large buffers on the stack in
> gdal.
> Use case:  (note that I can only share generals)
> At Google, we have jobs that use GDAL running with thousands of cores and
> >20 threads per process that run for days.  The overhead of having to allow
> for bumping the stack size adds substantial overhead to all those jobs.
> GDAL is the only thing driving the requirement for the larger stack.  For
> people using GDAL on a desktop machine, the larger stack is unlikely to be
> a real issue.  For anyone running large multithreaded jobs in the cloud,
> the large stack is a real cost issue.  The overhead of vector and heap
> allocation in all these cases I've looked at in GDAL so far is far smaller
> than the cost from the stack size overhead.

I misinterpreted this thread because of the title.  It seems this isn't
really about code style or C++ 11.  It's really about Google wanting to use
heap over stack because of its particular use of the library.  There is no
need for C++ 11 for that and it would seem that doing a compile-time
policy-based array isn't too hard (proof of concept below).  Perhaps Google
could flush something like this out to its liking and replace current stack
allocations that cause it issues.  C++ 11 and code style seem another


#include <iostream>

struct Stack

struct Heap

template <typename TYPE, std::size_t SIZE, typename AllocType>
struct Arr

template <typename TYPE, std::size_t SIZE>
struct Arr<TYPE, SIZE, Heap>
    Arr() : m_instance(new TYPE[SIZE ? SIZE : 1])

        delete [] m_instance;

    TYPE *m_instance;

    TYPE& operator[](std::size_t idx)
        { return *(m_instance + idx); }

template <typename TYPE, std::size_t SIZE>
struct Arr<TYPE, SIZE, Stack>
    TYPE m_instance[SIZE ? SIZE : 1];

    TYPE& operator[](std::size_t idx)
        { return m_instance[idx]; }

template <typename T, std::size_t SIZE>
struct Array : public Arr<T, SIZE, Heap>
template <typename T, std::size_t SIZE>
struct Array : public Arr<T, SIZE, Stack>

int main()
    Array<int, 25> a;

    a[10] = 15;
    std::cout << "A[10] = " << a[10] << "!\n";

    return 0;

Andrew Bell
andrew.bell.ia at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/gdal-dev/attachments/20160505/515d92a5/attachment-0001.html>

More information about the gdal-dev mailing list