왜 불가능한가 쌓을 수 있는 기능은 특정 변수에 값을 변경할 경우 확인할 수 있는 컴파일러와의 c++컴파일러는?

내가 이 책을 읽을 줄을.

&gt. 라도 유용 할 수 있는 것은 사실상 불가능한 구축하십시오 컴파일러와의 &gt. c++ 함수의 값을 바꿀 수 있는지 여부 확인 &gt. 특정 변수가.

왜 이 컴파일러는 단락 말한 보수적인 점검할 때 const 네스.

  • 왜 불가능한가 같은 컴파일러 가능* 구축

항상 확인할 수 있는 경우, 컴파일러는 함수 () 는 이에 대해 재지정됨 가변입니다 비사양 상수 호출되었을 기술입니까 미디어인지 전달된 기술입니까 비호환성의 비사양 상수 매개변수입니다.

질문에 대한 의견 (18)
해결책

&gt. 왜 이런 컴파일러와의 빌드되는 것으로 불가능한가?

같은 이유로 can& 있는지 여부를 결정할 수 있는 프로그램이 # 39 는 쓰지 않고, 특정 프로그램 종료됩니다. 이 널리 알려져 있다. 1 및 [정지 문제] # 39 의 it& that& # 39, 그 중 한 것을 생각할 일은 아닙니다.

명확히 확인할 수 있는 함수를 작성할 수 있습니다 컴파일러와의 변경하십시오 확장하지만 can& # 39 는 경우에 따라 , 변수, 함수 또는 won& 쓰지 않고 안정적으로 방정식입니다 알리는 변경하십시오 # 39 는 변수, 함수 (또는 정지) 의 모든 가능한 것이다.

39 의 here& 쉬운 예:

void foo() {
    if (bar() == 0) this->a = 1;
}

그냥 '에서 확인할 수 있는 방법은 컴파일러가 해당 코드를 살펴보고, foo' 은 'a' 로 변경 여부를 판매업체에서? # 39 는 외부 조건에 따라, 또는 doesn& 인스턴스인지 t 함수, 즉 '표시줄에는 구현'. # 39 의 there& 그 이상의 것을 생각할 수 있지만, t # 39 대비성 정지 문제 isn& it& # 39 의 링크됨 위키백과 문서 (그리고 모든 계산 이론 교과서) 에서 이미 아주 잘 설명했다 도왔으매 I& # 39, ll 시도하지 설명하란말야 올바른 삽입하십시오.

해설 (23)

이런 것을 컴파일러와의 존재합니다. # 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;
}
해설 (18)

39 don&, 특히 이 변수를 수정할 예정입니다., t 혼란을 &quot 않을 경우, 또는 실행 경로를 가지고 있는 한 variable.&quot inputs&quot &quot 수정되므로,

전 호출됨 [불투명도로 조건자 확인] (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++컴파일러는 놀라운 것으로 보인다.

해설 (3)

주요 기능은 포함되어 있는 것 같아요, 특정 값을 변경하십시오 &quot 여부를 c++컴파일러는 variable&quot. 는 will&quot ";). 수 있는지 여부를 확인하는 것은 분명 구축하십시오 컴파일러와의 는 C++ 함수의 값을 변경할 수 있는 특정 변수에 일어나는 변경하십시오 확실하게 말할 수 없습니다.

void maybe(int& val) {
    cout > reply;
    if (reply == "Y") {
        val = 42;
    }
}
해설 (5)

39, 내가 don& it& # 39 를 설명하기 위해 필요한 것 같지는 않다, s, t 알고리즘 can& 알 수 있는 호출하십시오 정지 문제 # 39 는 컴파일 타임에 주어진 함수의 특정 변수를 수정할 것인지 여부다.

39 의 it& 대신 충분한 조건이 달려 있다는 지적이다. # 39 의 비헤이비어를 function& can& 대해 알고 있는 t # 39, 컴파일러, 런타임 자주 열었다. E. g.

int y;

int main(int argc, char *argv[]) {
   if (argc > 2) y++;
}

어떻게 될 것인지 확실하게 예측할 컴파일러와의 'y' 수정되었음?

해설 (0)
  • 수행할 수도 있고, 이는 일부 기능을 수행하는 it all the time) * 및 컴파일러에도 간단한 예를 들어 단순한 인라인 접근자에 또는 여러 최적화 순결케 총괄하였습니다.

  • 어떤 것이 불가능한 안단말이야 의 일반 case.*

시스템 호출 또는 함수 호출이 있을 때 수시로 전화를 할 수 있는 방법, 또는 다른 모듈에서는 오는 오브리든 적대적 인수 등이 발생할 수 있는데, 일부 hacker& # 39 의 사용을 통해 스택 오버플로우 변경하시려면 연관해제된 변수다.

그러나 콩지름에 const 를 사용하지 않는 포인터 변수를 전역 변수, 포지셔닝하십시오 참조입니다 피할 수 있는 등, s # 39 는 compiler& 재사용합니다 연관해제된 작업을 수행할 때 생명요 간소화하는지 공격적인 최적화.

해설 (4)

이 설명하는 데 여러 가지 방안 중 하나가 되는 [정지 문제] (http://en.wikipedia.org/wiki/Halting_problem):

&gt. 계산 가능성 이론, 정지 문제 될 수 있는 이 다음과 같이 밝혔다. 설명을 마친 여부를 결정할 때, 임의의 &quot, 컴퓨터 프로그램 실행 중인 프로그램 또는 계속 forever&quot 실행하십시오;. 이는 주어진 문제를 해결하는 데 결정하는 입력 프로그램과 avamer 프로그램을 실행할 수 있는 입력 또는 멈출 것인지, 결국 실행하십시오 영생하리니.

&gt. 앨런 튜링은 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& 것이 됩니다.

해설 (0)

정말 깜짝 놀라게 할 수 있는 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 는 정지 문제. 이 때문에 이 번호요 반드시 정지 문제 계산할 수 없는 것으로 알려져 있다.

해설 (2)

즉시 다른 함수를 컴파일러가 함수 호출을 하는 doesn& # 39, t &quot see"; 이 관계자는 it 는 문제가 발생할 수 있다는 것을 잘 인컨텍스트 solaris. 가변입니다 변경, 추가 같습니다. 예를 들어, 우리는 이 &quot foo.cpp":

 void foo(int& x)
 {
    ifstream f("f.dat", ifstream::binary);
    f.read((char *)&x, sizeof(x));
 }

하나님이 이 &quot bar.cpp";:

void bar(int& x)
{
  foo(x);
}

어떻게 컴파일러와의 know&quot "; 'x' (또는 변화하고 더 정확히) 에 있는 변하지 않고 있다 '' 표시줄에는?

39, 좀 더 복잡한 i& 내놓아야 할 수 있는지, 만약 이게 isn& # 39 m, t 충분히 복잡합니다.

해설 (4)

컴파일러의 것은 일반적으로 수 있는지 등 그동안 가 가변적입니다 변경할 수 있다고 지적했다.

[질문] const 네스 확인할 때, 관심 있는 경우 수 변수 함수 의해 바뀔 것으로 보인다. 심지어 힘드실거라는 것은 지원할 수 있는 언어로 포인터를 가진다. # 39, t 제어 코드에 있는 다른 어떤 너회가 can& 포인터입니다 읽을 수 있고, 심지어 외부 소스에서 (단, 어려울 것 같다). 이러한 유형의 보장 및 메모리 액세스를 제한할 수 있는 언어로, 일어날 수 있는 것보다 더 적극적인 최적화이든 c++컴파일러는 높여줍니까 사용할 수 있습니다.

해설 (3)

내가 좀 더 구체적인 질문을 할 수 있는 어떤 것으로 저자는 다음과 같은 일련의 제약 권고하십시오 염두에 두고 있을 수 있다.

  1. Solaris. 컴파일러는 const 네스 관련하여 특정 기능 등을 비헤이비어를 변수. 수정을 위한 컴파일러가 함수 호출 할 것이라고 solaris. (아래와 같이 때문에 (alias) 가 다른 기능을 가변입니다 변경일 도왔으매 가정 # 1 만 t, 함수 호출 할 수 있는 코드 부분을 qic don& # 39.
  2. 39, t) 에 의해 수정되었음 solaris. 변수 isn& 비동기식이나 동시 활동까지입니다.

  3. Solaris. 컴파일러는 변수를 수정할 수 있을지 여부를 결정할 만 아니라 수정할 수 있습니다. 즉 수행 퀼트만 컴파일러는 정적 분석.
  4. Solaris. 컴파일러는 디렉토리에만 제대로 작동하는지 등을 고려할 때 코드 (어레이입니다 초과 / 언더런 고려하지 않고, 나쁜 포인터, etc.)

컴파일러 디자인 측면에서 볼 수 있는 가정, 내 생각엔 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.

해설 (0)

39, t '상수', '고 해도 가변입니다 doesn& 짓궂군요 일부 심하게 기록되었으므로 코드를 덮어쓰시겠습니까 수 있습니다.


//   g++ -o foo foo.cc

#include 
void const_func(const int&a, int* b)
{
   b[0] = 2;
   b[1] = 2;
}

int main() {
   int a = 1;
   int b = 3;

   std::cout 
해설 (3)

39 에 대한 확장할 수 있는 문제가 어떤 난독 book& 내 의견, 텍스트 여부는 아직 알 수 없다.

As I 사람도 있다는 것, 그 책을 말하도다 &quot let& # 39 의 모든 기능을 쓸 수 있는 무수한 확보하십시오 c++컴파일러는 판매업체에서 쓸 가능성도 있다. 만약 우리가 선택하는 경우도 있습니다 가변적입니다 etlat (특정 기능을 작성했습니까 몽키즈 () 는 구하사 can& 나열할지 기능은 변화의 variable.&quot 아웃해야 # 39, 빗나갔다.

물론 일부 믿지아니하며 (비록 많은) 기능을 통해 특정 응용 프로그램, 컴파일러와 매우 쉽게 확인할 수 있습니다. 제외한 모든 (또는 반드시 대부분).

이 함수의 쉽게 그러하매 평가하였다.

static int global;

void foo()
{
}

&quot foo"; 확실히요 &quot, global&quot, 수정할 수 없습니다. # 39 이 doesn&, 이 문제를 해결할 수 있는 매우 쉽게, 그리고 컴파일러와의 수정하십시오 전혀 아무것도 없다.

이 함수는 就不可能拥有 그러하매 평가하였다.

static int global;

int foo()
{
    if ((rand() % 100) > 50)
    {
        global = 1;
    }
    return 1;

이후, & # 39, &quot foo&quot 값을 변경할 수 있는 행동은, 런타임에 의존하는 있을지 알 수 없는 이 컴파일 타임에 수정하십시오 global&quot 반박했다 ";).

이 모든 것보다 훨씬 간단해진다는 개념을 이해하기 위해 컴퓨터 과학자들이 아웃해야 할 수 있습니다. 만약 함수가 실행 시 기준으로 변경할 수 있는 그런 것을 할 수 있는 뭔가 다른 게 무엇인지, ll do until it can& # 39, t 작동합니까 it& # 39 는 할 수 있으며, 이를 실행할 때마다 뭔가 다르다. # 39 it& 라도 유용 여부, s, s # 39 it& 방관하겠나, 불가능한 것은 불가능하다.

해설 (2)