bestsource

"const"는 단지 읽기 전용을 의미합니까 아니면 그 이상의 것을 의미합니까?

bestsource 2023. 8. 27. 09:44
반응형

"const"는 단지 읽기 전용을 의미합니까 아니면 그 이상의 것을 의미합니까?

가 입니까?const정말 심술궂습니까?읽기 전용은 제게 의미를 요약하는 것처럼 보이지만, 제가 맞는지 잘 모르겠습니다.

이고 읽전인경우및용기인 경우const다르군요, 누가 이유를 말해줄 수 있나요?

이 질문을 촉발시킨 은 그가 말하는 이 대답이었습니다.const"just"는 C에서 읽기 전용을 의미합니다.그게 다인 줄 알았어요. constC인지 C++인지에 관계없이 의미합니다.무슨 말이지?

의구적인차 대답한은의 구체적인 에 대한 constC 대 C++에서 저는 다음과 같은 새로운 질문을 만들었습니다."const"는 R...의 제안에 따라 C와 C++?에서 어떻게 다릅니까?

를 변를다음같선언으로 const컴파일러에서 해당 변수를 수정할 의도가 없음을 나타냅니다.하지만 그것은 다른 사람들이 그렇지 않다는 것을 의미하지는 않습니다!이것은 단지 일부 최적화를 허용하고 컴파일 오류에 의해 알림을 받기 위한 것입니다(참고로, 대부분 컴파일 오류입니다.const == ReadOnly런타임 오류를 의미합니다.

const읽기 전용을 의미하는 것은 아닙니다. 왜냐하면 당신은 쓸 수 있기 때문입니다.const volatile그것은 언제든 저절로 바뀔 수 있다는 것을 의미하지만, 저는 그것을 수정할 의도가 없습니다.

편집: 여기 고전적인 예가 있습니다. 메모리 매핑된 포트에서 현재 시간을 읽는 코드를 작성한다고 가정해 보십시오.RTC가 메모리 DWORD 0x1234에 매핑되어 있다고 가정합니다.

const volatile DWORD* now = (DWORD*)0x1234;

그건…const읽기 전용 포트이기 때문입니다.volatile왜냐하면 제가 읽을 때마다 바뀔 것이기 때문입니다.

많은 를 또한많아는효글변다같선다이언니합음과수를로벌은으로 합니다.constUB이기 때문에 읽기 전용입니다.이 경우 UB는 런타임 오류로 나타납니다.UB가 될 입니다 :) :)

여기 좋은 읽을거리가 있습니다: http://publications.gbdirect.co.uk/c_book/chapter8/const_and_volatile.html

컴일러다선음항허않습다로 된 .const수정할 예정입니다.말씀하신 대로입니다.

이것은 주로 함수 프로토타입에서 사용되며 사용자에게 포인터를 전달할 때 함수가 이것 또는 저것에 닿지 않을 것임을 알려줍니다.그것은 또한 여러분 자신을 위한 일종의 안전장치로도 작동합니다.

많은 사람들이 당신에게 말합니다.const수정할 수 없다는 뜻입니다.그것은 명백히 거짓입니다.const하찮은 일로 버려질 수 있습니다.이 코드 조각을 참고하십시오.

void foo(const int *somevalue)
{
   int *p = (int*) somevalue;
   *p = 256;  // OMG I AM EVIL!!!!11
}

컴파일러는 이 작업을 중지하지 않습니다. 그다면무, 그목은니까엇입의 요?const저는 그것을 제안이라고 부를 것입니다.여러분의 기능이 기대하는 계약의 기능 프로토타입을 살펴보면서 상기시킵니다.만약 당신이 부주의하게 그것을 부수면 당신의 컴파일러는 당신에게 소리칠 것입니다. (그러나 위의 캐스트처럼 의도적으로 그것을 부수면 그렇지 않습니다.)

에는 그 으로 깨지기도 .const의 반환 값을 기록합니다.strstr를 들어, ": ▁the▁into다▁some▁offset▁for니▁return▁will반합환:▁by예▁definition▁it로"로 일부 오프셋을 반환합니다.const당신이 제공하는 버퍼...은 그나반환값다같습음다니과은된러▁not▁is다같니습이 아닙니다.const왜죠? 음, 이것은 의미심장하게 부서질 것입니다. 반환 값을 사용하면.strstr비일비재하여constbuffer

동일한 바이트에 대한 2바이트(댓글 제외) 최소 대소문자 예제...

C에서 먼저 gcc가 경고를 발합니다...

배열에 포인터를 가져오는 함수두 개의 읽기 전용 정수.*/void a(정수(*parray)[2]);
void b(void b){int 배열[2] = {1,2};상수 trray[2] = {1,2};C는 이 파일을 읽기 전용 위치에 저장할 수 있는 권한을 보유합니다.*/
a( &array);경고: 호환되지 않는 포인터 유형에서 'a'의 인수 1을 전달합니다*/a( &crray); /* OK!*/}

이제 C++에서도 같은 것이...g++는 그것에 꽤 만족합니다.

배열에 포인터를 가져오는 함수수정하지 않겠다고 약속한 두 정수의.(우리가 버리지 않는 한 그것은 일관성입니다 ;-P)void a(정수(*parray)[2]);
void b(void b){int 배열[2] = {1,2};상수 trray[2] = {1,2};
a(&array); // C++는 이에 문제가 없습니다.a( &crray); // 알았어요!
}
const char * hello_1{ "Hello!" };
const char   hello_2[]{ "Hello!" };
char       * ptr{};

// take away the const-nes
// ptr = (char *)hello_1;
// *ptr = '*'; <-- write access violation
// hello_1 is in a read only memory

// take away the const-nes
ptr = (char *)hello_2;
*ptr = '*'; // <-- OK
// hello_2 is modifiable

메모리를 , 포터가메가리니킵다를모리인다▁pointers니가,킵▁to리▁memory▁and.char *읽기 전용인 데이터 세그먼트의 메모리를 가리킵니다.char *그리고.char [], 데이터둘 다 같은 되지만, 둘다데세그동서일방선한식만언지되로으에트먼터이,만▁is▁while▁both둘▁are지되선언▁segment▁the,▁that,char []사용할 경우 스택에 밀어넣기 때문에 가독성이 있는 것으로 간주됩니다.

C++을 사용하면 구성원 함수를 정의할 수 있습니다.const member 함수는 const 객체에서 호출되는 유일한 함수입니다.또한 const member 함수는 클래스의 데이터 멤버를 수정할 수 없습니다(데이터 멤버가 mutable로 표시되지 않은 경우).

class Foo
{
    int data;

    void Bar();
    void ConstBar() const;
};

void Foo::ConstBar() const
{
    // Error! cannot modify i as ConstBar is a const member function.
    // i = 0;
}

// Usage:
const Foo foo_instance;

// Error! cannot call non-const member on a const object.
// foo_instance.Bar();

// OK
foo_instance.ConstBar();

Const는 const를 제거하지 않고는 포인터나 참조를 쓰기 또는 읽기-수정-쓰기 작업에 사용할 수 없음을 의미합니다.C++ 표준이 의미하는 바를 의미하는 것은 아닙니다(C++ 표준은 이것에 대해 잘못되었을 뿐입니다).

다음과 같이 정의된 변수:

 /* auto */ int const x = 1;

그렇지 않으면 초기화할 수 없기 때문에 읽기 전용이 아닙니다.대신 변수 x의 종류는 "참조 상수 to int"(및 상수에 대한 참조가 아님) 또는 l값 const of int입니다."const"는 포인터 또는 참조와 관련이 없으며 스토리지에 있는 값의 유형과도 관련이 없습니다.

이는 const에서 제공하는 계약이 매우 취약하고, 특히 메모리 위치에서 지정된 캐시 또는 참조된 캐시를 허용하지 않기 때문에 매우 유감스러운 일입니다. 정확하게는 불변의 스토리지를 의미하지 않기 때문입니다.

결론은: const는 프로그래머가 심볼 제공자가 심볼 클라이언트에 대한 의무를 설정할 수 있도록 하기 위해 사용하는 심볼 참조 또는 포인터와 관련된 접근 수정자입니다.또는 심볼 클라이언트가 심볼 공급자에게 이 심볼을 통해 스토리지를 수정하지 않겠다고 약속하는 경우(예: 포인터 const to int를 수락하는 함수가 포인트 int를 수정하지 않겠다고 약속함).

이는 변수와 관련이 없습니다.

int const *p = (int*)malloc(sizeof(int));

스토리지와 거의 관련이 없습니다(스토리지는 항상 쓰기 가능).

대신에, 당신은 프로그램의 부분들 사이에 불변성, 의무 또는 요구 사항들을 전달하는 방법으로 생각해야 합니다. 프로그래머들이 목적을 위해 배치하고 유형 시스템에 의해 전파됩니다.안타깝게도 유형 시스템이 제대로 작동하지 않고 일관성을 올바르게 전파하지 못합니다.

X *last;
struct X { int a; X() : a(0) { last=this; } };
X const x; // x is const?
last->a = 1; //really ??

IMHO 컴파일러가 저장소를 불변으로 만들 수 있는 유일한 기회는 문자열 리터럴(아마도) 또는 정적(글로벌) 저장소와 같은 실제 상수입니다.자동, 힙 및 임시 저장소는 실제로 읽기 전용으로 만들 수 없습니다.

언급URL : https://stackoverflow.com/questions/4486326/does-const-just-mean-read-only-or-something-more

반응형