它使用较旧的g版本使用相同的编译器标志编译并运行没有问题.当编译器标志“-mssse3 -O3”被删除或被更低的优化级别(例如“-O2”)替换时,它也会编译并运行没有问题.
如果同时使用旧的和新的g编译器,使编译器标记为“-msse2 -mssse3 -O3”并且具有可移植的对齐内存分配器是必需的,那么存在哪些选项?在下面的代码中是否有一个简单的错误可以轻松修复?最后,为什么存在这个错误?
使用gdb时,触发此错误的行是:“memory [i] =(unsigned char)i;”.
非常感谢提前.
#include <iostream>using std::cerr;using std::cout;using std::endl;using std::flush;#include <stdlib.h>voID *aligned_alloc(int alignment,int size){ const int pointer_size = sizeof(unsigned char *); const int requested_size = size + alignment - 1 + pointer_size; unsigned char *base = (unsigned char *)malloc(requested_size); if (base == NulL) return NulL; unsigned char *start = base + pointer_size; const int trim_offset = (int)(((unsigned long long)(start+alignment-1)) & (alignment-1)); unsigned char *aligned = start + alignment - 1 - trim_offset; *(unsigned char **)(aligned-pointer_size) = base; return aligned;}voID aligned_free(voID **aligned){ if (*aligned == NulL) return; unsigned char *base = *(unsigned char **)((unsigned char *)(*aligned) - sizeof(unsigned char *)); free(base); *aligned = NulL;}int main(){ unsigned char *memory = (unsigned char *)aligned_alloc(16,120); if (memory == NulL){ cout<<"ERROR: Unable to allocate memory."<<endl; exit(1); } for (int i=0; i<120; i++){ memory[i] = (unsigned char)i; } aligned_free((voID **)&memory); return 0;}解决方法 这是由于cpu不支持SSSE3(补充流式SIMD扩展3)指令子集(特别是某种风格的3GHZ P4),试图运行为支持该指令子集的cpu编译的代码;简单地从GCC命令行中删除-mssse3标志应该足以导致违规指令消失. 总结
以上是内存溢出为你收集整理的c – 使用带有自定义对齐分配器实现的最新g编译SSE和-O3选项时的非法指令(核心转储)全部内容,希望文章能够帮你解决c – 使用带有自定义对齐分配器实现的最新g编译SSE和-O3选项时的非法指令(核心转储)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)