programing

C: C의 휘발성 배열

bestprogram 2023. 9. 24. 13:02

C: C의 휘발성 배열

volatile 키워드는 컴파일러가 변수에 대해 특정 최적화를 수행하는 것을 방지하기 위해 C에서 사용됩니다.

예를 들어,

volatile int my_int = 0;

정수를 만듭니다.일부 상황에서는 다음과 같은 최적화를 방지할 수 있습니다.

while(my_int == 0); // Loop until my_int != 0

최적화 대상:

while(1); // Loop infinity.

이는 인터럽트 함수 호출에 의해 변수가 수정될 수 있는 상황과 같이 임베디드 시스템에서 자주 발생하는 상황을 포함한 상황에 유용합니다.이 기술이 유용한 다른 예는 많이 있습니다.my_int플래그는 이러한 함수에 의해 수정된 플래그일 수 있습니다.(이것은 장난감 모형일 뿐입니다.)

그러나 함수에 의해 수정된 데이터가 배열인 경우를 고려합니다.데이터는 포인터로 가리킬 수 있습니다.

unsigned char* my_data = new unsigned char[256];

이 경우 이 질문[1]의 특정 상황에서 my_data가 전역 변수임을 고려하면 키워드가 중복입니까, 아니면 여전히 필요합니까?

[1] 중요하지 않을 수도 있습니다.

volatile 키워드가 필요하다고 대답한다면 올바른 구문은 무엇입니까?

예를들면,volatile unsigned char* my_data, 저는 포인터 자체가 휘발성이 있고 포인터가 가리키는 데이터는 아니라고 가정합니다.

마지막으로, C와 C++에서의 사용에 차이가 있습니까?

네.volatile필요하며 올바른 선언은 다음과 같습니다.

volatile unsigned char *my_data;

선언합니다.my_data서명되지 않은 차의 지시자가 될 겁니다

포인터 자체를 휘발성 있게 만들려면 대신 다음이 필요합니다.

unsigned char *volatile my_data;

그리고 물론 포인터와 포인팅된 데이터 모두 변동성이 있을 수 있습니다.

volatile unsigned char *volatile my_data;

C와 C++ 사이에는 차이가 없습니다.

필리페 곤살베스가 이미 답을 제공했지만, 좀 더 자세히 설명하고 싶습니다.

기본적으로 volatile 키워드는 프로그램이 현명해지려고 하지 않고 변수 값을 실제로 고려하기를 원할 때마다 필요합니다.사용자가 어떤 변수를 가지고 있는지는 중요하지 않지만, 컴파일러가 할당과 호출 사이의 변수에 대한 변경 사항을 볼 수 없는 경우(물론 사용자의 설정에 따라) 최적화할 수 있습니다.

컴파일러의 POV로부터, 사건의 순서는"assign 0 to Var"->"do unrelated stuff, but surely not touching Var"->"check Var value"Var를 어디서 얼마나 변수로 선언했는지는 중요하지 않으며, 코드는 만약 그렇지 않다면 최적화될 것입니다.volatile키워드가 사용됩니다.

C 선언문은 오른쪽에서 왼쪽으로 읽고 수식어는 왼쪽으로 읽습니다.

그렇게volatile char * x 성 char합니다.char volatile * x합니다에 합니다.

첫에 때 코드의 각 x[0] 에서 x[n] 의입니다(: ).a = x[n]*x[n])

두 번째 경우에는 xite 자체를 매번 읽고 x[n]의 주소를 다시 계산한 다음 x[n]을 읽어야 합니다.

로,volatile char volatile *x중복됩니다.

그러나 배열 또는 해당 요소를 휘발성으로 선언하면 컴파일러가 여러 읽기에 걸쳐 버퍼링하는 것을 방지할 수 있습니다.휘발성 배열을 읽는 함수가 이전 값을 포함하는 동안에는 배열의 전반부를 읽지 않고, (외부 변경 후) 업데이트된 값을 포함하는 동안에는 후반부를 읽지 않음으로써 일관성 없는 결과를 초래합니다.배열 또는 구조(또는 개별 변수 집합)에 휘발성을 사용하는 것은 개별 요소가 서로 독립적인 경우에만 권장됩니다.둘 중 하나를 변경하면 다른 것(또는 사용/의미)에 영향을 미치므로 휘발성이 전혀 도움이 되지 않으며 전체 액세스에 뮤텍스를 사용해야 합니다(처리 중 배열 내용이 변경되지 않도록 함).

언급URL : https://stackoverflow.com/questions/25332258/c-volatile-arrays-in-c