'인터페이스{}'를 다시 슬라이스로 변환하면 추가 힙 할당이 발생하는 이유는 무엇입니까?
PHP에서는 "인터페이스{}" 유형을 슬라이스 유형으로 변환할 때 추가 힙 할당이 발생합니다. 이는 PHP에서 인터페이스는 추상 데이터 유형이고 슬라이스는 동적 배열 유형이기 때문입니다. 인터페이스 유형을 슬라이스 유형으로 변환할 때 PHP는 슬라이스 요소를 저장하기 위해 슬라이스 유형에 추가 메모리 공간을 할당해야 합니다. 이러한 추가 힙 할당 작업으로 인해 추가 메모리 오버헤드가 발생하여 일부 메모리에 민감한 애플리케이션에 성능 문제가 발생할 수 있습니다. 따라서 타입 변환을 수행할 때 이 문제에 주의하고 불필요한 추가 힙 할당을 피하도록 노력해야 합니다.
질문 내용
func benchmarkpool(b *testing.b) { b.reportallocs() p := sync.pool{new: func() interface{} { return make([]byte, 1024) }} for i := 0; i < b.n; i++ { bts := p.get().([]byte) p.put(bts) } }
이 벤치마크는 go1.19.5에서 다음과 같은 출력을 제공합니다.
으아악사용하면 상황이 다르게 보입니다. *[]byte
:
interface{}
다시 슬라이스로 변환하면 추가 힙 할당이 발생하는 것 같습니다.
왜 go에 이러한 추가 할당이 필요한가요? 이에 대한 디자인 고려 사항은 무엇입니까?
해결책
할당의 원인은 any
到 []byte
的转换,而是 []byte
到 any
的转换。 p.Put(bts)
将参数 bts
隐式转换为 any
,然后再将其传递给 (*sync.Pool).Put
아닙니다. GoGC 1.19의 인터페이스는 한 쌍의 포인터로 구현됩니다. 하나는 유형 메타데이터를 가리키고 다른 하나는 실제 개체를 가리킵니다. 이 경우 두 번째 포인터가 풀로 이스케이프되어 슬라이스 개체가 할당됩니다. 이는 슬라이스 유형뿐만 아니라 포인터가 아닌 다른 유형에도 적용됩니다.
*[]byte
,编译器会执行优化,将其值直接放入 iface
结构中,从而在转换为接口时删除 *[]byte
와 같은 포인터의 경우 컴파일러는 해당 값을 iface
구조에 직접 배치하여 최적화를 수행하므로 인터페이스로 변환할 때
위 내용은 '인터페이스{}'를 다시 슬라이스로 변환하면 추가 힙 할당이 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











short는 -32,768에서 32,767 범위의 16비트 부호 있는 정수를 나타내는 Java의 기본 데이터 유형입니다. 카운터나 ID와 같은 작은 정수를 나타내는 데 자주 사용되며 기본적인 산술 연산 및 유형 변환을 지원합니다. 하지만 short는 부호 있는 형식이므로 나누기를 사용할 때 오버플로나 언더플로를 방지하도록 주의해야 합니다.

IFNULL 함수는 표현식이 NULL인지 확인하고, 그렇다면 지정된 기본값을 반환하고, 그렇지 않으면 표현식의 값을 반환합니다. 널값으로 인한 오류를 방지하고, 널값 조작을 허용하며, 쿼리의 가독성을 향상시킵니다. 사용법에는 null 값을 기본값으로 바꾸는 것, 계산에서 null 값을 제외하는 것, 여러 null 값 상황을 처리하기 위한 중첩된 사용법이 포함됩니다.

Java의 char 유형은 U+0000에서 U+FFFF까지의 2바이트를 차지하는 단일 유니코드 문자를 저장하는 데 사용됩니다. 주로 작은 따옴표나 유니코드 이스케이프 시퀀스를 통해 초기화할 수 있습니다. 비교에 참여할 수 있으며, Equality, inequality 및 Join 작업은 암시적으로 int 유형으로 변환되거나 명시적으로 Character 객체로 변환될 수 있습니다.

C 언어에서 나누기 연산자 /의 동작은 피연산자의 데이터 유형에 따라 다릅니다. 정수 나누기: 피연산자가 정수이면 정수 나누기가 수행되고 결과는 반내림됩니다. 부동 소수점 나누기: 피연산자가 부동 소수점 숫자인 경우 부동 소수점 나누기가 수행되고 결과는 부동 소수점 숫자입니다. 유형 변환: 한 피연산자는 정수이고 다른 피연산자는 그렇지 않은 경우 정수가 암시적으로 부동 소수점 숫자로 변환된 후 부동 소수점 나누기가 수행됩니다. 0으로 나누기: 나누기가 0이면 수학적 오류가 발생합니다. 모듈로 연산: 모듈로 연산에는 모듈로 나누기 대신 % 연산자를 사용합니다.

Oracle의 더하기(+) 연산자는 문자열, 숫자, 날짜 및 시간 간격을 연결하고 NULL 값을 처리하고 NULL을 NULL이 아닌 값으로 변환하는 데 사용할 수 있습니다.

MySQL에서 별표(*)는 "모두"를 의미하며 다양한 용도로 사용됩니다. 모든 열 선택 모든 행 선택 테이블에 대한 JOIN 와일드카드 LIKE 절 REGEXP 절에 대한 수량자 암시적 유형 변환

C++ 함수 오버로드 일치 규칙은 다음과 같습니다. 호출의 매개변수 수와 유형을 일치시킵니다. 매개변수의 순서는 일관되어야 합니다. constness와 참조 수정자는 일치해야 합니다. 기본 매개변수를 사용할 수 있습니다.

암시적 유형 변환의 일반적인 애플리케이션 시나리오를 살펴보겠습니다! 소개: 프로그래밍 언어에서 암시적 유형 변환은 자동으로 수행되는 데이터 유형 변환 프로세스입니다. 일부 프로그래밍 언어에서는 이 변환이 컴파일러나 인터프리터에게 변환을 수행하도록 명시적으로 지시할 필요 없이 암시적으로 수행됩니다. 암시적 유형 변환에는 프로그래밍의 광범위한 애플리케이션 시나리오가 있습니다. 이 기사에서는 몇 가지 일반적인 애플리케이션 시나리오에 대해 설명합니다. 수치 계산의 암시적 유형 변환 수치 계산에서는 서로 다른 유형의 데이터 간의 연산이 필요한 경우가 많습니다. 데이터 종류가 다를 때
