memcpy 구현을 제공하는 방법
저는 베어 메탈 코드를 작성하려고 합니다.memset
- 스타일 루프 포함:
for (int i = 0; i < N; ++i) {
arr[i] = 0;
}
그것은 GCC로 컴파일되고 GCC는 그것을 전화로 바꿀 수 있을 만큼 충분히 똑똑합니다.memset()
불행하게도 그것은 베어 메탈이기 때문에 나는 가지고 있지 않습니다.memset()
(일반적으로 libc에서) 링크 오류가 발생합니다.
undefined reference to `memset'
이러한 전환을 수행하는 최적화는 다음과 같습니다.
라이브러리에 대한 호출로 코드를 생성할 수 있는 패턴의 루프 배포를 수행합니다.이 플래그는 -O2 이상에서 기본적으로 활성화됩니다.
-fprofile-use
그리고.-fauto-profile
.
그래서 한 사람의 해결책은 최적화 수준을 낮추는 것이었습니다.별로 만족스럽지 않습니다.
나는 또한 이것을 설명하는 매우 유용한 페이지를 찾았습니다.-ffreestanding
GCC가 이를 수행하지 못하도록 하기에는 충분하지 않으며 기본적으로 사용자가 직접 구현할 수 있는 옵션 외에는 없습니다.memcpy
,memmove
,memset
그리고.memcmp
저는 그렇게 해서 기쁩니다, 하지만 어떻게요?
내가 그냥 글을 쓴다면,memset
컴파일러는 내부의 루프를 감지하여 memset 호출로 변환합니다!실제로 제가 사용하고 있는 CPU 벤더가 제공한 코드에서 다음과 같은 의견을 발견했습니다.
/*
// This is commented out because the assembly code that the compiler generates appears to be
// wrong. The code would recursively call the memset function and eventually overruns the
// stack space.
void * memset(void *dest, int ch, size_t count)
...
그래서 저는 그것이 그들이 마주친 문제라고 생각합니다.
의 C 구현을 제공하려면 어떻게 해야 합니까?memset
컴파일러가 자신에 대한 호출에 최적화하지 않고 최적화를 비활성화하지 않고 있습니까?
아하 glibc 코드를 확인해보니inhibit_loop_to_libcall
이렇게 해야 할 것처럼 들리는 수식어.정의는 다음과 같습니다.
/* Add the compiler optimization to inhibit loop transformation to library
calls. This is used to avoid recursive calls in memset and memmove
default implementations. */
#ifdef HAVE_CC_INHIBIT_LOOP_TO_LIBCALL
# define inhibit_loop_to_libcall \
__attribute__ ((__optimize__ ("-fno-tree-loop-distribute-patterns")))
#else
# define inhibit_loop_to_libcall
#endif
질문에서 다음과 같이 언급했습니다.
이 변환을 수행하는 최적화는 다음과 같습니다.
이 최적화를 해제하기 위해 필요한 것은 통과입니다.-fno-tree-loop-distribute-patterns
편집자에게.이렇게 하면 전체적으로 최적화가 해제됩니다.
언급URL : https://stackoverflow.com/questions/67210527/how-to-provide-an-implementation-of-memcpy
'programing' 카테고리의 다른 글
파일이 없는 경우 파일 만들기 (0) | 2023.07.31 |
---|---|
단일 스레드, 비OS, 임베디드 애플리케이션에서 글로벌 변수가 무엇입니까? (0) | 2023.07.31 |
아약스 요청에서 X-Requested-With 헤더를 제거할 수 있습니까? (0) | 2023.07.31 |
Spring JPA로 소프트 삭제 처리 (0) | 2023.07.31 |
제온을 위한 gcc 최적화 플래그? (0) | 2023.07.31 |