[PATCH] D15539: [libcxxabi] Reducing stack usage of test

Ben Craig via cfe-commits cfe-commits at lists.llvm.org
Wed Dec 16 12:18:28 PST 2015


bcraig added a comment.

In http://reviews.llvm.org/D15539#312336, @jroelofs wrote:

> In http://reviews.llvm.org/D15539#312332, @bcraig wrote:
>
> > In http://reviews.llvm.org/D15539#312319, @jroelofs wrote:
> >
> > > What does having them be `long double`s give over just multiplying the counts by 16 (or however big it is on your platform)? Alignment?
> > >
> > > Seems like it'd be better to start with a prime that's ~16x larger, say 211, than to have that factor of 16 floating around everywhere.
> >
> >
> > Alignment is the main answer.  I'd use max_align_t directly, except that it got added in C++11, and this test should be able to run in C++98 and C++03.
> >  Using a large type instead of a char also makes it easier to avoid making two padding values that look different, but aren't actually all that different due to internal padding.  Just starting at a high prime wouldn't fix this, as then I have to ensure that consecutive values are separated by at least sizeof(void *).
>
>
> What platform are you on where sizeof(void*) is anywhere near 13 bytes?


I'm on a platform where void* is 4 bytes (Hexagon).  That's not what I was getting at though.  Lets take x86_64 as an example instead.

  #include <iostream>
  
  struct A {
    virtual ~A() {}
    char _[17];
  };
  struct B {
    virtual ~B() {}
    char _[19];
  };
  struct C {
    virtual ~C() {}
    char _[23];
  };
  
  int main() {
    std::cout<<"A: "<<sizeof(A)<<std::endl; //prints 32
    std::cout<<"B: "<<sizeof(B)<<std::endl; //prints 32
    std::cout<<"C: "<<sizeof(C)<<std::endl; //prints 32
    return 0;
  }

I could reasonable see an optimizer collapsing some of these classes together in some way or another.  If you change the chars out for long doubles, then all three classes have different sizes.


http://reviews.llvm.org/D15539





More information about the cfe-commits mailing list