C++ provides a direct syntactic mechanism for specifying whether a given object slot should be inlined: the type system explicitly denotes storage allocation. However, the type system denotes other things too, so specifying an object as inline allocated (e.g. declaring lower_left to be of type Point rather than Point *) also determines other behaviors (e.g. changes the meaning of assignment). Hence inline allocation is not simply a performance optimization. This can make specifying inline allocation awkward-for instance a list element conceptually contains a reference to its data-or even impossible due to semantic changes. Finally, this mechanism leaves the burden of deciding what to inline on the programmer. On the other hand, because we want to preserve a uniform model and our analysis opens up other optimization opportunities, our inline allocation is done automatically by the compiler.