考虑以下使用的简单代码new(我知道没有delete[],但它与此问题无关):
int main()
{
int* mem = new int[100];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是否允许编译器优化new呼叫?
在我的研究中,g ++(5.2.0)和Visual Studio 2015不会优化new呼叫,而clang(3.0+)则可以.所有测试都是在启用完全优化的情况下进行的(-O3用于g ++和clang,用于Visual Studio的发布模式).
是不是new在引擎盖下进行系统调用,使编译器无法(并且非法)优化它?
编辑:我现在已经从程序中排除了未定义的行为:
#include <new>
int main()
{
int* mem = new (std::nothrow) int[100];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑2:
#include <new>
int main()
{
int* mem = new (std::nothrow) int[1000];
if (mem != 0)
return 1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行以下代码时,我希望一旦foo()执行,它使用的内存(主要是 create m)就会被释放。然而,事实并非如此。要释放此内存,我需要重新启动 IPython 控制台。
%%cython
# distutils: language = c++
import numpy as np
from libcpp.map cimport map as cpp_map
cdef foo():
cdef:
cpp_map[int,int] m
int i
for i in range(50000000):
m[i] = i
foo()
Run Code Online (Sandbox Code Playgroud)
如果有人能告诉我为什么会出现这种情况以及如何在不重新启动 shell 的情况下释放此内存,那就太好了。提前致谢。
刚刚__length_hint__()从PEP 424(https://www.python.org/dev/peps/pep-0424/)遇到了这个非常棒的迭代器方法.哇!一种获取迭代器长度而不会耗尽迭代器的方法.
我的问题:
编辑: BTW,我看到__length__hint__()从当前位置到结束的计数.即部分消耗的迭代器将报告剩余长度.有趣.
python ×2
c++ ×1
clang ×1
containers ×1
cython ×1
gcc ×1
generator ×1
memory ×1
memory-leaks ×1
optimization ×1
python-3.x ×1