gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 22:56:37 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com