当询问C中常见的未定义行为时,灵魂比我提到的严格别名规则更加开明.
他们在说什么?
我在这里浏览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链接后面页面上的代码如下所示:
Run Code Online (Sandbox Code Playgroud)/* 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 …
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的新手,我很困惑何时投射指针实际上是好的.
据我所知,你几乎可以将任何指针类型转换为任何其他类型,编译器将允许你这样做.例如:
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:
只是为了澄清:我明确地只询问"正常"指针,即不是关于函数指针.我意识到强制转换函数指针的规则是非常严格的.事实上,我已经问过:-):如果我转换函数指针,改变参数个数会发生什么
int i=40;
char *p;
p=(char *)&i;//What actually happens here?
printf("%d",*p);
Run Code Online (Sandbox Code Playgroud)
什么是输出?请帮忙!
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)
做hwvec1和arr1依赖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 ×5
casting ×3
c++ ×1
glibc ×1
intrinsics ×1
optimization ×1
pointers ×1
portability ×1
strlen ×1
type-punning ×1
x86 ×1