Bja*_*une 9 c++ cpu-architecture
int* a = new int[5] - 1;
Run Code Online (Sandbox Code Playgroud)
这一行本身根据C++标准调用未定义的行为,因为a是一个无效的指针而不是一个接一个的结尾.同时,这是制作基于1的数组(第一个元素是[1])的零开销方式,我需要用于我的项目.
我想知道这是否是我需要避免的,或者如果C++标准只是保守地支持一些奇怪的架构,我的代码永远都不会运行.所以问题是,这将是一个什么样的架构问题?这些广泛存在吗?
编辑:要查看上面的行确实调用了未定义的行为,请查看此问题.
编辑:Dennis Zickefoose指出,当调用未定义的行为时,允许编译器执行任何操作,因此编译器和CPU都必须提供超出C++标准的保证,以便像这样的代码工作.我正在将问题扩展到现代C++编译器是否存在这个问题.
无论哪种方式,创建基于单一的数组的定义明确,零开销的方法如下:
int* a = new int[6];
Run Code Online (Sandbox Code Playgroud)
那里,问题解决了.;-)(但仍然有趣的问题.)
用于执行检查的硬件存在于所有 x86 处理器中,只是目前我们没有在最流行的操作系统中使用它。
如果您使用分段内存架构(我们为 16 位系统所做的),则分配不太可能返回地址segment:0。在这种情况下,您无法从该地址中减去任何内容!
这是阅读分段内存以及为什么无法加载无效段的起点:
http://en.wikipedia.org/wiki/Segment_descriptor
您必须决定您的代码是否不太可能发生这种情况,或者您是否可以定义一个重载operator[]来为您处理偏移量。