Tag: gcc

__sync_val_compare_and_swap vs __sync_bool_compare_and_swap

我一直在考虑这两个函数的返回值。 __sync_bool_compare_and_swap函数的返回值似乎有明显的好处,即我可以用它来判断交换操作是否发生。 但是我看不到__sync_val_compare_and_swap的返回值。 首先,让我们有一个函数签名供参考(来自GCC docs减去var args): type __sync_val_compare_and_swap (type *ptr, type oldval type newval); 我看到的问题是__sync_val_compare_and_swap的返回值是* ptr的旧值。 确切地说,一旦适当的记忆障碍得以实施,这是该function的实施所看到的价值。 我明确说明了这一点,以满足在调用__sync_val_compare_and_swap和执行指令以强制执行内存屏障之间的事实,* ptr的值可能很容易改变。 现在,当函数返回该返回值时我能做什么? 尝试将它与* ptr进行比较是没有意义的,因为现在可以在其他线程上更改* ptr。 同样地比较newval和* ptr对我来说也没有什么帮助(除非我锁定* ptr,这可能首先破坏了我对primefaces的使用)。 所以我真正要做的就是询问返回值是否= = oldval,这是否有效(参见下面的警告)询问交换操作是否发生。 所以我本来可以使用__sync_bool_compare_and_swap。 我刚才提到的警告是,我在这里看到的唯一细微差别是,这样做并不能告诉我交换是否发生,它只是告诉我在内存屏障释放之前的某个时刻* ptr有相同的值为newval。 我正在考虑oldval == newval的可能性(虽然我很难看到一种有效实现函数的方法,以便它可以先检查这些值,如果它们是相同的则不交换,所以它可能是一个没有实际意义的点)。 但是我看不出这样一种情况,即知道这种差异会对我在呼叫站点产生影响。 事实上,我无法想象我会将oldval和newval设置为相等的情况。 我的问题是: 是否存在使用__sync_val_compare_and_swap和__sync_bool_compare_and_swap不等效的用例,即是否存在提供比另一个更多信息的情况? 在旁边 我之所以考虑这个问题,是因为我发现__sync_val_compare_and_swap的实现方式与sync_bool_compare_and_swap有竞争: inline int32_t __sync_val_compare_and_swap(volatile int32_t* ptr, int32_t oldval, int32_t newval) { int32_t ret = *ptr; […]

如何使用avx指令将float向量转换为short int?

基本上我怎么能用AVX2内在函数写出相当于这个? 我们假设result_in_float的类型为__m256 ,而result的类型为short int*或short int[8] 。 for(i = 0; i < 8; i++) result[i] = (short int)result_in_float[i]; 我知道使用__m256i _mm256_cvtps_epi32(__m256 m1)内在函数可以将浮点数转换为32位整数,但不知道如何将这些32位整数进一步转换为16位整数。 我不仅仅想要这样,而且还要将这些值(以16位整数的forms)存储到存储器中,我想使用向量指令来完成所有这些操作。 在互联网上搜索,我找到了一个名为_mm256_mask_storeu_epi16的内在函数,但是我不确定是否会这样做,因为我找不到它的用法示例。

链接到库时,__start_section和__stop_section符号丢失

我在类似于这个线程的autotools C项目中使用自定义elf头: 如何在C(gcc)中获得自定义ELF部分的起始和结束地址? 。 问题是声明自定义部分的c文件链接到静态库,然后链接到最终应用程序。 在此配置中,不会生成符号__start_custom_section和__stop_custom_section。 我像这样定义精灵部分: struct mystruct __attribute((__section__(“custom_section”))) __attribute((__used__) = { … }; 如果我链接到目标文件而不是库,则会创建符号,并且所有内容都按预期工作。 这不是一个可扩展的解决方案,因为我希望通过将新模块编译到模块库中来实现新模块。 知道为什么链接器在库中存在部分与单个目标文件时不会创建这些特殊符号?

c编译器无法在mac上创建可执行文件

每次我尝试从配置文件在我的mac(Maverick)上安装软件包或软件时,它会在检查C编译器时自动失败。 它说“configure:error:C编译器无法创建可执行文件”。 此外,Homebrew完美运作。 我附上了一个config.log的例子。 我没有在以前的相关post中找到任何满意的,如果问题得到解决,我道歉。 ## ———– ## ## Core tests. ## ## ———– ## configure:2530: checking for gcc configure:2546: found /usr/local/bin/gcc configure:2557: result: gcc configure:2786: checking for C compiler version configure:2795: gcc –version >&5 gcc (GCC) 4.8.0 20130113 (experimental) Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the source for […]

告知clang内联汇编读取特定的内存区域

GCC(我可以方便地测试的所有版本)可以告诉内联汇编语句读取一个特定的内存区域(表示为指针p和大小为n ),这个结构非常难以理解: asm (“…” : : “m” (*(struct { char x[n]; } *)p)); 但是,这在clang中不起作用(3. [45]),你得到一个很难的错误: error: fields must have a constant size: ‘variable length array in structure’ extension will never be supported asm (“…” : : “m” (*(struct {char x[n];} *)p)); ^ 是否(理想情况下)是一个不同的构造,它将在两个编译器中产生相同的效果,或者(不这样)一个不同的构造,只会在clang中产生相同的效果? 请注意,在我关心的情况下,我没有插入实际的assembly说明; 构造的要点是指示编译器不要删除明显死的memset 。 因此,“不同构造”完全不能完全涉及内联组装。 但是,请建议读取任意内存或生成其他代码的构造,只有在没有其他选择的情况下。 另外,不要建议memset_s , explicit_bzero或类似的; 这是尝试在不必破解编译器的情况下实现这些函数的回退。 随后是全面的演示程序 – #include […]

什么是堆栈粉碎(C)?

码: int str_join(char *a, const char *b) { int sz =0; while(*a++) sz++; char *st = a -1, c; *st = (char) 32; while((c = *b++)) *++st = c; *++st = 0; return sz; } …. char a[] = “StringA”; printf(“string-1 length = %d, String a = %s\n”, str_join(&a[0],”StringB”), a); 输出: string-1 length = 7,char […]

gcc链接器获取未使用对象的列表

我想在具有许多库的大型C应用程序中识别未使用的目标文件。 随着时间的推移,该项目已经发展很多,现在我想搜索不再使用的库,以便我可以从依赖文件中删除它们。 是否可以使用gcc链接器识别未使用的任何对象? 例如,如果我使用gcc编译应用程序,并且假设没有使用library2的符号/函数。 有没有办法获取有关哪些对象未链接的信息? gcc library1.o library2.o main.o -o main.elf 我知道gcc有编译器和链接器标志来删除未使用的符号: -fdata-sections -ffunction-sections -Wl,–gc-sections 但是这种方式我不知道gcc删除了哪些对象。 如果gcc可以选择获取未链接到应用程序的对象列表,那将是完美的。 仅举几个:我需要基于目标文件而不是基于function/符号! 有没有人知道gcc的这种选择?

我可以在64位机器上制作这种结构的最小尺寸是多少?

typedef struct node{ char one; char two; struct node *next; } nodea; 我在考虑编译器填充方面,有什么方法可以使sizeof(nodea)小于16?

是否可以使用预处理器对数组进行排序?

我有很多很长的数组。 无法进行运行时排序。 手动排序也很耗时。 此外,可以在以后以任何顺序添加新元素,因此我想使用C预处理器按值对它们进行排序,或者可能有任何编译器标志(GCC)? 例如: sometype S[] = { {somevals, “BOB”, someothervals}, {somevals, “ALICE”, someothervals}, {somevals, “TIM”, someothervals}, } 必须排序如下: sometype S[] = { {somevals, “ALICE”, someothervals}, {somevals, “BOB”, someothervals}, {somevals, “TIM”, someothervals}, } 解决了 好的,这是我的解决方案: 手动将每个数组复制并粘贴到名为tobesorted.c的临时文件中 按第二列sort -b -i –key=2 tobesorted.c : sort -b -i –key=2 tobesorted.c 将输出复制并粘贴回原始文件。 实际上,有一种可能性直接从预处理器调用“排序”会很好(我希望至少GCC能以某种方式支持这些function,但似乎它没有)。

gcc(windows + MinGW)是否在inttypes.h中定义了SCNd8,SCNu8?

#include #include int main(void) { int8_t int8; int16_t int16; int32_t int32; int64_t int64; uint8_t uint8; uint16_t uint16; uint32_t uint32; uint64_t uint64; scanf(“%”SCNd8″%”SCNd16″%”SCNd32″%”SCNd64″%”SCNu8″%”SCNu16″%”SCNu32″%”SCNu64, &int8, &int16, &int32, &int64, &uint8, &uint16, &uint32, &uint64); printf(“%”PRId8″\n%”PRId16″\n%”PRId32″\n%”PRId64″\n%”PRIu8″\n%”PRIu16″\n%”PRIu32″\n%”PRIu64″\n”, int8, int16, int32, int64, uint8, uint16, uint32, uint64); return 0; } 我无法使用最新的gcc + MinGW + Netbeans + Windows编译此代码。 Netbeans说“无法解析标识符SCNd8和SCNu8”。 我在gcc手册页上找不到SCNd8和SCNu8的任何参考,尽管http://linux.die.net/include/inttypes.h定义了它们。 我没有收到使用PRId8或PRIu8的语法错误。 MinGW inttypes.h(缺少SCNd8和SCNu8)(示例代码) #define […]