![]() |
1
13
您的指针是常量,它告诉调用函数的任何人,您不会接触通过该变量指向的数据。不幸的是,编译器仍然不知道结果是否是常量指针的别名。可以始终使用非常量指针作为常量指针。例如,许多函数都将常量字符(即字符串)指针作为参数,但如果您愿意,可以将其传递为非常量指针,该函数只是向您承诺不会使用该特定指针来更改任何内容。 基本上,为了更接近您的问题,您需要添加对a和b的限制,以便向编译器“保证”使用此函数的人不会将结果作为别名传递给a或b。当然,假设您能够做出这样的承诺。 |
![]() |
2
8
这里的每个人似乎都很困惑。到目前为止,任何答案中都没有一个常量指针的例子。
宣言
所以问题应该是
|
![]() |
3
8
是的,你需要限制。 指向const的指针并不意味着没有任何东西可以更改数据,只是不能通过该指针更改数据。 .
不像
编译器确实知道
记住
以我的经验(在GCC和Clang方面)
如果循环中有函数调用,
GCC6.3(针对x86-64 SysV ABI)决定保留
clang4.0将此优化为仅加载
例如,此函数的调用方可能传递了全局变量的地址
. 但是任何修改
c的GNU方言允许使用
编译器通常在做标准允许的优化方面非常积极,即使它们让一些程序员感到惊讶,并且破坏了一些发生在工作中的现有不安全代码。(C是如此可移植,以至于许多东西在基本标准中都是未定义的行为;大多数好的实现确实定义了许多标准保留为ub的东西的行为。)C不是一种可以安全地向编译器抛出代码的语言,直到它按照您的需要执行,而不检查您是否按正确的方式执行(不使用signed intEger溢出等) 如果您查看用于编译函数的x86-64ASM输出(从问题中),您可以很容易地看到不同之处。我把它穿上 the Godbolt compiler explorer .
在这种情况下,将
用
例如
VS
综上所述,
放
顺便说一句,
自从 |
![]() |
4
7
在
C-99标准
有一些例子
strtoimax和strtoumax函数简介
因此,如果假设标准不提供这样一个例子,如果
|
![]() |
5
1
如前所述,您需要添加“限制”。 我还想评论一下您的场景,“结果可能与a重叠”。这不是编译器检测到“a”可能更改的唯一原因。它也可以被另一个有指向“a”的指针的线程更改。因此,即使您的函数没有更改任何值,编译器仍然会假设“a”可以更改。 |