<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, May 5, 2016 at 10:19 AM, Kurt Schwehr <span dir="ltr"><<a href="mailto:schwehr@gmail.com" target="_blank">schwehr@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div>Thanks all for your comments!  I will try to write up a similar proposal for C++11 based on what people have written.<br></div><div><br></div><div>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.<br></div><div><br></div><div>Use case:  (note that I can only share generals)<br></div><div><br></div><div>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.</div>
</div></div>
</blockquote></div><br>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 conversation.</div><div class="gmail_extra"><br></div><div class="gmail_extra">======</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra">#include <iostream></div><div class="gmail_extra"><br></div><div class="gmail_extra">struct Stack</div><div class="gmail_extra">{};</div><div class="gmail_extra"><br></div><div class="gmail_extra">struct Heap</div><div class="gmail_extra">{};</div><div class="gmail_extra"><br></div><div class="gmail_extra">template <typename TYPE, std::size_t SIZE, typename AllocType></div><div class="gmail_extra">struct Arr</div><div class="gmail_extra">{</div><div class="gmail_extra">};</div><div class="gmail_extra"><br></div><div class="gmail_extra">template <typename TYPE, std::size_t SIZE></div><div class="gmail_extra">struct Arr<TYPE, SIZE, Heap></div><div class="gmail_extra">{</div><div class="gmail_extra">    Arr() : m_instance(new TYPE[SIZE ? SIZE : 1])</div><div class="gmail_extra">    {}</div><div class="gmail_extra"><br></div><div class="gmail_extra">    ~Arr()</div><div class="gmail_extra">    {</div><div class="gmail_extra">        delete [] m_instance;</div><div class="gmail_extra">    }</div><div class="gmail_extra"><br></div><div class="gmail_extra">    TYPE *m_instance;</div><div class="gmail_extra"><br></div><div class="gmail_extra">    TYPE& operator[](std::size_t idx)</div><div class="gmail_extra">        { return *(m_instance + idx); }</div><div class="gmail_extra">};</div><div class="gmail_extra"><br></div><div class="gmail_extra">template <typename TYPE, std::size_t SIZE></div><div class="gmail_extra">struct Arr<TYPE, SIZE, Stack></div><div class="gmail_extra">{</div><div class="gmail_extra">    TYPE m_instance[SIZE ? SIZE : 1];</div><div class="gmail_extra"><br></div><div class="gmail_extra">    TYPE& operator[](std::size_t idx)</div><div class="gmail_extra">        { return m_instance[idx]; }</div><div class="gmail_extra">};</div><div class="gmail_extra"><br></div><div class="gmail_extra"><br></div><div class="gmail_extra">#ifdef HEAPALLOC</div><div class="gmail_extra">template <typename T, std::size_t SIZE></div><div class="gmail_extra">struct Array : public Arr<T, SIZE, Heap></div><div class="gmail_extra">{};</div><div class="gmail_extra">#else</div><div class="gmail_extra">template <typename T, std::size_t SIZE></div><div class="gmail_extra">struct Array : public Arr<T, SIZE, Stack></div><div class="gmail_extra">{};</div><div class="gmail_extra">#endif</div><div class="gmail_extra"><br></div><div class="gmail_extra">int main()</div><div class="gmail_extra">{</div><div class="gmail_extra">    Array<int, 25> a;</div><div class="gmail_extra"><br></div><div class="gmail_extra">    a[10] = 15;</div><div class="gmail_extra">    std::cout << "A[10] = " << a[10] << "!\n";</div><div class="gmail_extra"><br></div><div class="gmail_extra">    return 0;</div><div class="gmail_extra">}</div><div><br></div>-- <br><div class="gmail_signature">Andrew Bell<br><a href="mailto:andrew.bell.ia@gmail.com" target="_blank">andrew.bell.ia@gmail.com</a></div>
</div></div>