关于C 自动变量效率的大小的实际限制是什么?
What is the practical limit regarding size concerning efficiency of automatic variables in C++?
我有以下变量(简化情况):
std::array<std::array<float, 4>, 4> matrix;
我需要从程序中的函数中返回此变量。我可以使用std::unique_ptr
或将其返回为值(自动与动态内存)
由于我平台上的浮子的大小为4个字节,并且有16个位置,大小为16 * 4 = 64
字节。
没有自定义分配器等的动态内存可能会导致内存碎片,除了通常的速度慢外,我想知道将数据传递到自动内存与动态内存的实际限制是什么?我应该开始使用动态内存的大小?问题是无法回答的吗?
如果您担心因初始化功能而返回这样的结构的大小,那么我就不会对该语句(如果不确定,您可以随时测量)。
所有现代编译器都已经在进行RVO和NRVO优化。结果,即使您未通过价值返回,也没有制作副本。编译器已经确定了结果将进入特定的目的地,并将副本放在了目的地。
因此,大小约束并不是真正的问题。
也使用C 11引入了移动语义的概念。因此,您不需要按价值返回,而是通过移动返回。在大多数STD容器中,这只是意味着交换几个指针(不幸的是,这对STD :: Array无济于事),但总的来说,它运行良好。
所以对我来说,这可能是按价值返回的。尽管我可能会在课堂上包裹该结构。这样,如果现实叮咬并且确实花费很多,我可以内部更改课程以补偿而不更改代码。
我不认为您可以通过进行64个字节分配来导致任何碎片化。根据我在32位环境中进行大型应用的经验,由于分裂问题,大于16 MB的分配可能会失败。为了使分配产生分裂,他们应该长期生活。对于服务器代码,这超过几天。在64位中,不可能发生Env碎片。
按值传递参数意味着创建副本。这可能不是有效的。推荐的工作正在使用参考。尺寸没有众所周知的限制。
根据我的经验,我建议使用PC这样的平台:
- 变量的大小小于100个字节 - 按值通过;
- var的大小大于1 kb-使用参考并避免复制;
值是中间是灰色区域,这两个决定都可以。再一次,这些数字没有魔法含义。只是一些合理的参考。
我建议您考虑使用参考而不是堆存。
您是否实际上观察到了性能降级,然后将其追溯到此代码?因为如果这只是一个理论上的问题,那么我建议您实际上以看起来直觉和自然的方式编码内容。
完成此操作并确定了所有的纠结后,您可以运行程序,看看您实现的性能是否可以接受;如果不是,则可以设置优化实际瓶颈,而不是想象的
唐纳德·诺斯(Donald Knuth)说:"我们应该忘记效率小的效率,大约97%的时间:早产优化是所有邪恶的根源。"
在堆栈上复制64个字节很便宜。它几乎比分配64个字节便宜。如果您将unique_ptr用于分配在堆上的短期寿命变量,您几乎肯定会失去效率。
如果您只需调用您的功能并立即使用返回值,则很快。只有当您打算通过一系列矩阵返回功能来传播矩阵时,您的效率损失就会显着。分配内存和使用unique_ptr的可行性取决于重新返回数据的次数,而不是取决于数据的实际大小。
使用动态阵列为此是过度的。您不仅要分配64个字节以容纳16个浮子。您正在为数组分配4个内存块,每个存储器块将具有用于堆管理的标题,并且每个C 的数组大小,并且内部内部的内存分配通常会使用比您要求的块大,通常会在块边界上对齐。
然后,您拥有容纳每个数组的结构的开销。例如。每个std ::数组是一个包含指向您对象的指针的类,它的8个字节至少为8个字节(指针为4个,而数组长度为4个。
。,您没有参考。矩阵中的每一行可能在内存中彼此之间距离很远。如果他们彼此相邻,他们会在单个缓存线中读取。
您最好只使用:
float matrix[4][4[
如果您需要它面向对象,请将其包装在类中:
class Matrix44
{
float matrix[4][4];
}
这将更加高效。
- Visual C++: MSVC vs. GCC+CLANG: 处理 lambda 捕获类成员变量,正确的方法是什么?
- 存储变量的更有效方法是什么?
- 变量 BitMask 在函数 CeilLog2 中的实际效果是什么?
- 这个变量在 C++ 中的范围是什么?
- 使用 gtest 框架在单元测试代码中检查目标对象的私有变量的最佳实践是什么?
- 将共享指针传递给函数参数 - 将其分配给局部变量的正确方法是什么
- 作为副本传递的 std::move()'d 变量的效果是什么?
- 在C++中,变量声明左侧的大括号是什么意思?
- 追问:C++14/C++17 中的变量到底是什么?
- 在多个对象中初始化预定义成员变量的正确方法是什么?
- C++ LibcURL IMAP 获取包含主题行的变量是什么?
- 计算两个uint8_t变量之间差值的最快方法是什么?
- 函数作为变量的语义是什么 C++.
- 使用 std::shared_ptr 接收变量作为引用的利弊是什么?
- 告诉编译器我希望变量始终存储在寄存器中的正确方法是什么
- 在 c++ 中使用右值设置类变量的最有效方法是什么
- 使变量成为常数的重要性是什么?
- 使用与号后跟下划线命名的变量是什么意思?
- 在Visual Studio中生成的匿名命名空间变量的损坏名称的数字部分是什么意思
- 当函数采用右值引用时,函数中该变量的类型是什么?