다음 인라인 함수를 고려하십시오.
// Inline specifier version
#include<iostream>
#include<cstdlib>
inline int f(const int x);
inline int f(const int x)
{
return 2*x;
}
int main(int argc, char* argv[])
{
return f(std::atoi(argv[1]));
}
및 constexpr 동등한 버전 :
// Constexpr specifier version
#include<iostream>
#include<cstdlib>
constexpr int f(const int x);
constexpr int f(const int x)
{
return 2*x;
}
int main(int argc, char* argv[])
{
return f(std::atoi(argv[1]));
}
내 질문은 : constexpr
지정자가 inline
상수가 아닌 인수가 constexpr
함수에 전달 되면 컴파일러가 지정자가 선언에 포함 된 inline
것처럼 함수를 시도 한다는 의미에서 지정자를 암시 inline
합니까?
C ++ 11 표준이 보장합니까?
답변
예 ([dcl.constexpr], C ++ 11 표준의 §7.1.5 / 2) : “constexpr 함수 및 constexpr 생성자는 암시 적으로 인라인 (7.1.2)입니다.”
참고 그러나 것을 inline
지정 정말이 매우 컴파일러 가능성이 함수 인라인 여부를 확장하는 것입니다 여부에 (있는 경우) 거의 영향을. 그러나 이는 하나의 정의 규칙에 영향을 미치며 그 관점에서 컴파일러는 constexpr
함수와 동일한 규칙을 따라야합니다 inline
.
또한 constexpr
암시에 관계없이 C ++ 11의 함수에 inline
대한 규칙 constexpr
은 인라인 확장을위한 좋은 후보가 될 수있을 정도로 간단해야합니다 (주요 예외는 재귀적인 것임). 그러나 그 이후로 규칙은 점차 완화 constexpr
되어 훨씬 더 크고 복잡한 기능에 적용될 수 있습니다.
답변
constexpr
inline
비 정적 변수 (C ++ 17 인라인 변수)를 의미하지 않습니다.
함수를 constexpr
암시 하지만 inline
C ++ 17 인라인 변수를 고려할 때 비 정적 변수에는 영향을주지 않습니다.
예를 들어, 내가 게시 한 최소한의 예제를 취한다면 : 인라인 변수는 어떻게 작동합니까? 를 제거 inline
하고을 남겨두면 constexpr
변수가 여러 주소를 가져옵니다. 이는 인라인 변수가 피하는 주요 사항입니다.
constexpr
그러나 정적 변수는 암시 적으로 정적입니다.
함수 를 constexpr
의미 inline
하는 최소한의 예
https://stackoverflow.com/a/14391320/895245 에서 언급했듯이 주요 효과는 inline
인라인이 아니라 함수의 여러 정의를 허용하는 것입니다. 표준 인용문은 다음과 같습니다. C ++ 헤더 파일에 구현이 포함되는 방법은 무엇입니까?
다음 예제를 통해이를 관찰 할 수 있습니다.
main.cpp
#include <cassert>
#include "notmain.hpp"
int main() {
assert(shared_func() == notmain_func());
}
notmain.hpp
#ifndef NOTMAIN_HPP
#define NOTMAIN_HPP
inline int shared_func() { return 42; }
int notmain_func();
#endif
notmain.cpp
#include "notmain.hpp"
int notmain_func() {
return shared_func();
}
컴파일 및 실행 :
g++ -c -ggdb3 -O0 -Wall -Wextra -std=c++11 -pedantic-errors -o 'notmain.o' 'notmain.cpp'
g++ -c -ggdb3 -O0 -Wall -Wextra -std=c++11 -pedantic-errors -o 'main.o' 'main.cpp'
g++ -ggdb3 -O0 -Wall -Wextra -std=c++11 -pedantic-errors -o 'main.out' notmain.o main.o
./main.out
inline
에서 제거 shared_func
하면 다음과 같이 링크가 실패합니다.
multiple definition of `shared_func()'
헤더가 여러 .cpp
파일에 포함되기 때문 입니다.
우리가 대체하지만 inline
함께 constexpr
하기 때문에, 그것은 다시 작동 constexpr
도 의미한다 inline
.
GCC는 ELF 개체 파일에서 심볼을 약한 것으로 표시하여이를 구현합니다. C ++ 헤더 파일에 구현이 어떻게 포함될 수 있습니까?
GCC 8.3.0에서 테스트되었습니다.