내가 이 책을 읽을 줄을.
>. 라도 유용 할 수 있는 것은 사실상 불가능한 구축하십시오 컴파일러와의 >. c++ 함수의 값을 바꿀 수 있는지 여부 확인 >. 특정 변수가.
왜 이 컴파일러는 단락 말한 보수적인 점검할 때 const 네스.
항상 확인할 수 있는 경우, 컴파일러는 함수 () 는 이에 대해 재지정됨 가변입니다 비사양 상수 호출되었을 기술입니까 미디어인지 전달된 기술입니까 비호환성의 비사양 상수 매개변수입니다.
>. 왜 이런 컴파일러와의 빌드되는 것으로 불가능한가?
같은 이유로 can& 있는지 여부를 결정할 수 있는 프로그램이 # 39 는 쓰지 않고, 특정 프로그램 종료됩니다. 이 널리 알려져 있다. 1 및 [정지 문제] # 39 의 it& that& # 39, 그 중 한 것을 생각할 일은 아닙니다.
명확히 확인할 수 있는 함수를 작성할 수 있습니다 컴파일러와의 변경하십시오 확장하지만 can& # 39 는 경우에 따라 , 변수, 함수 또는 won& 쓰지 않고 안정적으로 방정식입니다 알리는 변경하십시오 # 39 는 변수, 함수 (또는 정지) 의 모든 가능한 것이다.
void foo() {
if (bar() == 0) this->a = 1;
}
그냥 '에서 확인할 수 있는 방법은 컴파일러가 해당 코드를 살펴보고, foo' 은 'a' 로 변경 여부를 판매업체에서? # 39 는 외부 조건에 따라, 또는 doesn& 인스턴스인지 t 함수, 즉 '표시줄에는 구현'. # 39 의 there& 그 이상의 것을 생각할 수 있지만, t # 39 대비성 정지 문제 isn& it& # 39 의 링크됨 위키백과 문서 (그리고 모든 계산 이론 교과서) 에서 이미 아주 잘 설명했다 도왔으매 I& # 39, ll 시도하지 설명하란말야 올바른 삽입하십시오.
이런 것을 컴파일러와의 존재합니다. # 39 의 편의를 제공하고, s 도 solaris. let& 라리브러리 반환하는 함수를 변수와 함수 doesn& 때 주어진 함수 수정되므로 통과한 경우 1, 0 # 39 없다. 그럼 어떻게 해야 이 프로그램은 인쇄하십시오?
int variable = 0;
void f() {
if (modifies_variable(f, variable)) {
/* do nothing */
} else {
/* modify variable */
variable = 1;
}
}
int main(int argc, char **argv) {
if (modifies_variable(f, variable)) {
printf("Modifies variable\n");
} else {
printf("Does not modify variable\n");
}
return 0;
}
전 호출됨 [불투명도로 조건자 확인] (http://en.wikipedia.org/wiki/Opaque_predicate) 에 사소 결정할 수 없다 - 정지 문제, 그냥 점 감소) 를 별도로 아웃해야 투입물 권능은하나님께 소스를 알 수 없는 얻을 수 있습니다 (예: 사용자). , 모든 언어가 아니라 c++컴파일러는 의 마찬가지입니다.
그러나 후자의 기술서임을 수 , 구문 트리 보면 확인할 수 있는 모든 것은 그들이 행하는모든 에로남이네 컴파일러에도 생각하신거야 최적화합니다 못하며창조된. [순결케 총괄하였습니다] (http://en.wikipedia.org/wiki/Pure_function) (및 [레페렌시알리 투명해집니다] (http://en.wikipedia.org/wiki/Referential_transparency_% 28computer_science% 29) 기능, 장치당 [일부 정의 레페렌시알리 투명해집니다] (https://stackoverflow.com/a/4965613/238419)) %s/dbase/ext_table. 쉽게 적용할 수 있는 온갖 좋은 최적화, 그 값을 갖는 등 극한상황에 린리네이블 또는 컴파일 타임에 결정된다. 그러나 우리가 할 수 있는 기능은 다운로드되었는지 순결케 다운로드되었는지 정보기술 (it) 판매업체에서 수정하십시오 변수.
그렇다면 실제로 모든 언어에 대한 간단한 기술서임을 대한 설명으로 c++컴파일러는 놀라운 것으로 보인다.
주요 기능은 포함되어 있는 것 같아요, 특정 값을 변경하십시오 " 여부를 c++컴파일러는 variable". 는 will" ";). 수 있는지 여부를 확인하는 것은 분명 구축하십시오 컴파일러와의 는 C++ 함수의 값을 변경할 수 있는 특정 변수에 일어나는 변경하십시오 확실하게 말할 수 없습니다.
void maybe(int& val) {
cout << "Should I change value? [Y/N] >";
string reply;
cin >> reply;
if (reply == "Y") {
val = 42;
}
}
int y;
int main(int argc, char *argv[]) {
if (argc > 2) y++;
}
어떻게 될 것인지 확실하게 예측할 컴파일러와의 'y' 수정되었음?
수행할 수도 있고, 이는 일부 기능을 수행하는 it all the time) * 및 컴파일러에도 간단한 예를 들어 단순한 인라인 접근자에 또는 여러 최적화 순결케 총괄하였습니다.
어떤 것이 불가능한 안단말이야 의 일반 case.*
시스템 호출 또는 함수 호출이 있을 때 수시로 전화를 할 수 있는 방법, 또는 다른 모듈에서는 오는 오브리든 적대적 인수 등이 발생할 수 있는데, 일부 hacker& # 39 의 사용을 통해 스택 오버플로우 변경하시려면 연관해제된 변수다.
그러나 콩지름에 const 를 사용하지 않는 포인터 변수를 전역 변수, 포지셔닝하십시오 참조입니다 피할 수 있는 등, s # 39 는 compiler& 재사용합니다 연관해제된 작업을 수행할 때 생명요 간소화하는지 공격적인 최적화.
이 설명하는 데 여러 가지 방안 중 하나가 되는 [정지 문제] (http://en.wikipedia.org/wiki/Halting_problem):
>. 계산 가능성 이론, 정지 문제 될 수 있는 이 다음과 같이 밝혔다. 설명을 마친 여부를 결정할 때, 임의의 ", 컴퓨터 프로그램 실행 중인 프로그램 또는 계속 forever" 실행하십시오;. 이는 주어진 문제를 해결하는 데 결정하는 입력 프로그램과 avamer 프로그램을 실행할 수 있는 입력 또는 멈출 것인지, 결국 실행하십시오 영생하리니.
>. 앨런 튜링은 1936년 그 문제를 해결하기 위해 가능한 모든 것을 해결할 수 있어 일반 알고리즘입니다 프로그램 입력을 페어 존재할 수 없습니다.
만약 내가 쓸 수 있는 프로그램으로 다음과 같습니다.
do tons of complex stuff
if (condition on result of complex stuff)
{
change value of x
}
else
{
do not change value of x
}
'X' 의 값을 높여줍니까 변경하십시오? 이 먼저 결정할 수 있는 '가' 여부를 결정할 수 있는 조건을 볼지옥으로 - 혹은 더 복잡한 내용들을 못하며창조된 세제곱밀리미터 부품이라면 기본, 인스턴스인지 중단됩니다. # 39, s, t # 39 can& 컴파일러와의 that& 것이 됩니다.
정말 깜짝 놀라게 할 수 있는 t # 39, 정지 문제 있다는 답변을 isn& 사용하여 직접! # 39 에서 이 문제를 매우 간단한 there& 감소, s 는 정지 문제.
컴파일러는 함수 값을 변경할 수 있다는 걸 알았다 떠날려하면 여부가 변수다. 그렇다면 다음과 같은 함수 y 의 값을 변경하고 구하사 여부를 알 수 있을 것으로 보고, x 의 값을 방관하겠나 추적할 수 있는 모든 페이징됩니다 남은 기간 동안 프로그램:
foo(int x){
if(x)
y=1;
}
좋아, 지금은 모든 프로그램을 let& # 39 의 재작성할 있기 때문이다.
int y;
main(){
int x;
...
run the program normally
...
foo(x);
}
우리 프로그램의 경우, 단 것을 알 수 없습니다 - y 의 값을 변경할 경우, 그 전에 마지막으로 foo () 는 종료시킵니다 않니다 종료하십시오. 즉, we& # 39, ve 정지 문제 해결!
어떤 문제가 있는지 확인하는 것이 위의 감소 공장폐쇄 variable& # 39 는 최대한 at least 값 변경, s 는 정지 문제. 이 때문에 이 번호요 반드시 정지 문제 계산할 수 없는 것으로 알려져 있다.
즉시 다른 함수를 컴파일러가 함수 호출을 하는 doesn& # 39, t " see"; 이 관계자는 it 는 문제가 발생할 수 있다는 것을 잘 인컨텍스트 solaris. 가변입니다 변경, 추가 같습니다. 예를 들어, 우리는 이 " foo.cpp":
void foo(int& x)
{
ifstream f("f.dat", ifstream::binary);
f.read((char *)&x, sizeof(x));
}
하나님이 이 " bar.cpp";:
void bar(int& x)
{
foo(x);
}
어떻게 컴파일러와의 know" "; 'x' (또는 변화하고 더 정확히) 에 있는 변하지 않고 있다 '' 표시줄에는?
컴파일러의 것은 일반적으로 수 있는지 등 그동안 가 가변적입니다 변경할 수 있다고 지적했다.
[질문] const 네스 확인할 때, 관심 있는 경우 수 변수 함수 의해 바뀔 것으로 보인다. 심지어 힘드실거라는 것은 지원할 수 있는 언어로 포인터를 가진다. # 39, t 제어 코드에 있는 다른 어떤 너회가 can& 포인터입니다 읽을 수 있고, 심지어 외부 소스에서 (단, 어려울 것 같다). 이러한 유형의 보장 및 메모리 액세스를 제한할 수 있는 언어로, 일어날 수 있는 것보다 더 적극적인 최적화이든 c++컴파일러는 높여줍니까 사용할 수 있습니다.
내가 좀 더 구체적인 질문을 할 수 있는 어떤 것으로 저자는 다음과 같은 일련의 제약 권고하십시오 염두에 두고 있을 수 있다.
컴파일러 디자인 측면에서 볼 수 있는 가정, 내 생각엔 1.3,4 퍼펙트 센스 있는 코드 정확성 및 / 또는 코드 보기입니다 컴파일러와의 작성기에 컨텍스트로 세대 최적화합니다. 일리있네요 부재 속에 2 같은 휘발성 키워드. 그리고 이러한 가정을 집중적으로 질문에 답할 수 있을 만큼 제안된 또 보면 훨씬 더 명확한 :-)
그 이유는, 가정, 특히 핵심 const 네스 can& # 39 는 변수 (alias 인해 것으로 간주할 수 없다. # 39, 또 다른 변수가 가리키는 것인지 알 수 없는 can& 컴파일러는 이 상수 변수. 수 (alias 인해 컴파일 유닛, 이 경우 같은 다른 기능을 사용할 수 있다고 판단할 수 있는 기능과 컴파일러와의 여바바 구현하므로 호츨 트리 정적으로 앨리어싱 발생할 수 있습니다. 이 때문에 다음 코드 또는 다른 외국 라리브러리 신앙이니라 (alias) 는 함수 시작 시 표시할지를 변수는 가칭된 컴파일러와의 지 알 길이 없다.
그 경우 / 인수는 변수가 될 수 있다는 것이다, t # 39 선택함 const shouldn& 통해 변경될 수 있으나, 앨리어스, s # 39 는 컴파일러와의 작성기에 that& 예쁜 받는다. 인간이 프로그래머용 위험할 수도 있습니다, 상수 변수 선언할 수 있는 대형 프로젝트 일환으로, 그는 말하도다 doesn& # 39 의 비헤이비어를 모르는 시스템 전체를 또는 OS, 라이브러리, 정말 won& 가변적입니다 알아야 # 39, t change.
// g++ -o foo foo.cc
#include <iostream>
void const_func(const int&a, int* b)
{
b[0] = 2;
b[1] = 2;
}
int main() {
int a = 1;
int b = 3;
std::cout << a << std::endl;
const_func(a,&b);
std::cout << a << std::endl;
}
출력:
1
2
As I 사람도 있다는 것, 그 책을 말하도다 " let& # 39 의 모든 기능을 쓸 수 있는 무수한 확보하십시오 c++컴파일러는 판매업체에서 쓸 가능성도 있다. 만약 우리가 선택하는 경우도 있습니다 가변적입니다 etlat (특정 기능을 작성했습니까 몽키즈 () 는 구하사 can& 나열할지 기능은 변화의 variable." 아웃해야 # 39, 빗나갔다.
물론 일부 믿지아니하며 (비록 많은) 기능을 통해 특정 응용 프로그램, 컴파일러와 매우 쉽게 확인할 수 있습니다. 제외한 모든 (또는 반드시 대부분).
이 함수의 쉽게 그러하매 평가하였다.
static int global;
void foo()
{
}
" foo"; 확실히요 ", global", 수정할 수 없습니다. # 39 이 doesn&, 이 문제를 해결할 수 있는 매우 쉽게, 그리고 컴파일러와의 수정하십시오 전혀 아무것도 없다.
이 함수는 就不可能拥有 그러하매 평가하였다.
static int global;
int foo()
{
if ((rand() % 100) > 50)
{
global = 1;
}
return 1;
이후, & # 39, " foo" 값을 변경할 수 있는 행동은, 런타임에 의존하는 있을지 알 수 없는 이 컴파일 타임에 수정하십시오 global" 반박했다 ";).
이 모든 것보다 훨씬 간단해진다는 개념을 이해하기 위해 컴퓨터 과학자들이 아웃해야 할 수 있습니다. 만약 함수가 실행 시 기준으로 변경할 수 있는 그런 것을 할 수 있는 뭔가 다른 게 무엇인지, ll do until it can& # 39, t 작동합니까 it& # 39 는 할 수 있으며, 이를 실행할 때마다 뭔가 다르다. # 39 it& 라도 유용 여부, s, s # 39 it& 방관하겠나, 불가능한 것은 불가능하다.