强制c++编译器对一个对象的所有堆栈实例发出警告
Force c++ compiler to warn about all stack instances of an object
为了优化的目的,我想重构一个大的代码库,在这里,我想防止类类型的堆栈使用。例如:
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
}
另一方面,如果没有办法让编译器这样做,那么我可以用另一种方式吗?意思是不警告堆栈使用,但总是警告全局实例或类的包含成员?
您可以将类构造函数设置为私有,然后创建一个类静态函数或自由友元工厂函数来为您构造实例。
工厂函数总是在堆上分配并返回一个指针(最好是智能指针)。
那么你会得到错误消息到处代码试图构造一个类实例,你可以去修复它们,而不是使用工厂函数。由于没有其他方法来构造对象,因此可以确保所有实例都在堆上分配。
您还可以为这些对象创建专门的内存池。如果它们非常大或奇怪,这可能有助于减少碎片。
除了在编译器中实现之外,没有办法强制编译器生成警告。我会使用clang-tidy,并将其与CI系统集成。下面是clang-tidy的简单教程:http://bbannier.github.io/blog/2015/05/02/Writing-a-basic-clang-static-analysis-check.html
相关文章:
- 在堆栈上创建类实例
- 在 C++ 中在堆栈上创建实例时如何保持多态性?
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- 以下代码如何工作以每次为唯一调用堆栈唯一实例化模板函数?
- "new"创建的实例的所有成员变量是否都存在于堆上而不是堆栈上?
- 在函数中实例化的 STL 对象正在占用堆栈或堆上的内存?
- 从基类堆栈调用派生类实例
- 可以在堆上实例化虚拟对象,但不能在堆栈上实例化
- 有没有办法强制实例只在堆栈上
- C++不允许堆栈实例,但允许新的删除
- 为什么类实例作为指针使用堆而不使用堆栈
- 实例化对象C++的堆栈和堆分配
- C++:在堆栈中实例化类的正确方法是什么
- 在没有“new”关键字的情况下实例化类会导致在堆栈或堆上创建其内部变量
- 为什么不总是实例化堆栈上的对象?C++
- C++ 使用单个输入字节文件的不同部分实例化堆栈上的成员类
- 在堆或堆栈上的指针类实例中分配C++非指针数据成员
- 从方法堆栈编译中按值返回实例
- 在堆栈上实例化一个类,其中 var 在标头中定义
- 为什么运行时堆栈对象的实例变量与堆对象不同