c++ - 强制 C++ 编译器警告对象的所有堆栈实例

标签 c++ optimization stack compiler-warnings simd

为了优化目的,我想重构一个大型代码库,在前进的地方,我想防止类类型的堆栈使用。例如:

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/

相关文章:

Java 变量 -> 替换?内存优化

python - 运行关键字/函数的最有效方法是什么?

java - 在 Java 中使用 "sincos"

c++ - 对 const 的右值引用有什么用吗?

c++ - 是否可以在 opencv FileStorage 中使用字符串作为名称

多种颜色的 C++ DirectX DrawText

c++ - Qt 序列化,非成员 QDataStream & operator<<

C++在不知道位置的情况下删除 vector 中的特定值

Java 堆栈和一个明显毫无意义的练习

c - 传递给函数的指针不重新分配