为了优化目的,我想重构一个大型代码库,在前进的地方,我想防止类类型的堆栈使用。例如:
class noStack
{
int x;
// I don't want this on the stack
};
void foo()
{
noStack bar; // I want the compiler to issue a warning here.
class moreNoStack { int a; noStack b; }
moreNoStack baz; // Also warn here because baz is on the stack and contains a noStack
}
但另一方面,我希望编译器忽略这一点:
noStack g_globalNoStack; // no warning
class foo
{
noStack bar; // no warning
};
foo g_globalFoo; // no warning
void func()
{
foo* p = (foo*)malloc(sizeof(foo)); // no warning
foo* q = new foo; // no warning
}
另一方面,如果没有办法让编译器执行此操作,那么我是否可以反其道而行之?意思是不警告堆栈使用但总是警告全局实例或包含的类成员?我可以用任何一种方式解决这个问题。
最佳答案
您可以通过将类构造函数设为私有(private),然后创建类静态或自由友元工厂函数来为您构造实例来实现此目的。
工厂函数总是在堆上分配并返回一个指针(最好是智能指针)。
然后你会在代码试图构建类实例的任何地方收到错误消息,你可以修复它们以改用工厂函数。由于没有其他方法来构造对象,您可以确保所有实例都分配在堆上。
您还可以为这些对象创建专门的内存池。如果它们非常大或奇怪,这可能有助于减少碎片。
关于c++ - 强制 C++ 编译器警告对象的所有堆栈实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32383337/