相关疑难解决方法(0)

什么是严格别名规则?

当询问C中常见的未定义行为时,灵魂比我提到的严格别名规则更加开明.
他们在说什么?

c strict-aliasing undefined-behavior type-punning

778
推荐指数
10
解决办法
19万
查看次数

为什么要快速运行glibc的问题太复杂了?

我在这里浏览strlen代码,想知道是否真的需要代码中使用的优化?例如,为什么下面这样的东西不能同样好或更好?

unsigned long strlen(char s[]) {
    unsigned long i;
    for (i = 0; s[i] != '\0'; i++)
        continue;
    return i;
}
Run Code Online (Sandbox Code Playgroud)

较简单的代码对编译器进行优化是否更好或更容易?

strlen链接后面页面上的代码如下所示:

/* Copyright (C) 1991, 1993, 1997, 2000, 2003 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   Written by Torbjorn Granlund (tege@sics.se),
   with help from Dan Sahlin (dan@sics.se);
   commentary by Jim Blandy (jimb@ai.mit.edu).

   The GNU C Library is free software; you can redistribute it and/or
   modify it under …
Run Code Online (Sandbox Code Playgroud)

c optimization portability glibc strlen

283
推荐指数
7
解决办法
5万
查看次数

在C中转换指针的规则是什么?

K&R不会过去,但他们会使用它.我尝试通过编写示例程序来了解它是如何工作的,但它并没有那么顺利:

#include <stdio.h> 
int bleh (int *); 

int main(){
    char c = '5'; 
    char *d = &c;

    bleh((int *)d); 
    return 0;  
}

int bleh(int *n){
    printf("%d bleh\n", *n); 
    return *n; 
}
Run Code Online (Sandbox Code Playgroud)

它编译,但我的print语句吐出垃圾变量(每次调用程序时它们都不同).有任何想法吗?

c pointers casting

60
推荐指数
5
解决办法
13万
查看次数

何时在指针类型之间进行转换而不是C中未定义的行为?

作为C的新手,我很困惑何时投射指针实际上是好的.

据我所知,你几乎可以将任何指针类型转换为任何其他类型,编译器将允许你这样做.例如:

int a = 5;
int* intPtr = &a;
char* charPtr = (char*) intPtr; 
Run Code Online (Sandbox Code Playgroud)

但是,通常这会调用未定义的行为(尽管它恰好在许多平台上运行).这说,似乎有一些例外:

  • 你可以void*自由地投射(?)
  • 你可以char*自由地投射(?)

(至少我在代码中看过它...).

那么指针类型之间的哪些转换在C 中不是未定义的行为?

编辑:

我试着研究C标准("6.3.2.3指针"一节,见http://c0x.coding-guidelines.com/6.3.2.3.html),但除了一点点之外,我并没有真正理解它void*.

EDIT2:

只是为了澄清:我明确地只询问"正常"指针,即不是关于函数指针.我意识到强制转换函数指针的规则是非常严格的.事实上,我已经问过:-):如果我转换函数指针,改变参数个数会发生什么

c casting undefined-behavior

32
推荐指数
3
解决办法
7209
查看次数

将指向整数的指针强制转换为指向char的指针时会发生什么?

int i=40;
char *p;
p=(char *)&i;//What actually happens here?
printf("%d",*p);
Run Code Online (Sandbox Code Playgroud)

什么是输出?请帮忙!

c casting

6
推荐指数
3
解决办法
1万
查看次数

硬件 SIMD 向量指针和相应类型之间的“reinterpret_cast”是否是未定义的行为?

reinterpret_castafloat*到 a__m256*float通过不同的指针类型访问对象是否合法?

constexpr size_t _m256_float_step_sz = sizeof(__m256) / sizeof(float);
alignas(__m256) float stack_store[100 * _m256_float_step_sz ]{};
__m256& hwvec1 = *reinterpret_cast<__m256*>(&stack_store[0 * _m256_float_step_sz]);

using arr_t = float[_m256_float_step_sz];
arr_t& arr1 = *reinterpret_cast<float(*)[_m256_float_step_sz]>(&hwvec1);
Run Code Online (Sandbox Code Playgroud)

hwvec1arr1依赖undefined behaviors 吗?

它们是否违反了严格的别名规则?[基本.lval]/11

或者只有一种定义的内在方式:

__m256 hwvec2 = _mm256_load_ps(&stack_store[0 * _m256_float_step_sz]);
_mm256_store_ps(&stack_store[1 * _m256_float_step_sz], hwvec2);
Run Code Online (Sandbox Code Playgroud)

神箭

c++ x86 intrinsics undefined-behavior language-lawyer

6
推荐指数
1
解决办法
1080
查看次数