c – 使用带有自定义对齐分配器实现的最新g编译SSE和-O3选项时的
发布时间:2020-12-16 07:10:14 所属栏目:百科 来源:网络整理
导读:当使用g(GCC)4.8.3 20140911(Red Hat 4.8.3-7)使用编译命令“g -g -fno-omit-frame-pointer -msse2 -mssse3 -O3 Memory”编译以下代码时. cpp“,可执行文件在执行时引发”非法指令(核心转储)“. 它使用较旧的g版本使用相同的编译器标志编译并运行没有问题.当
当使用g(GCC)4.8.3 20140911(Red Hat 4.8.3-7)使用编译命令“g -g -fno-omit-frame-pointer -msse2 -mssse3 -O3 Memory”编译以下代码时. cpp“,可执行文件在执行时引发”非法指令(核心转储)“.
它使用较旧的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标志应该足以导致违规指令消失.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |