运行 包含头文件时的函数 c++
Run function when header is include c++
我正在单个头文件中构建快速三角函数逼近。
#ifndef COOL_MATH_H
#define COOL_MATH_H
#include <cmath>
const float PI = std::acos(-1);
namespace trigonometry
{
namespace
{
float _cos[180];
}
void init()
{
for (int i = 0; i < 90; i++)
{
_cos[i] = cosf(float(i) * PI/180.0f);
}
}
float cos(float deg)
{
int nearest = int(abs(deg) + 0.5) % 90;
return _cos[nearest];
}
float sin(float deg)
{
return cos(90.0f - deg);
}
}
#endif
如果我错了请纠正我,但这个近似值理论上比内置三角函数更快?
主要问题是:
如果包含头文件(即只有一次),我如何 运行 函数 trigonometry::init()
?我只想存储 _cos[180]
的值一次。
How can I run the function trigonometry::init() when the header file is included (i.e. only once)?
#ifndef COOL_MATH_H
#define COOL_MATH_H
#include <cmath>
#include <array>
const float PI = std::acos(-1);
namespace trigonometry
{
namespace
{
std::array<float, 180> init()
{
std::array<float, 180> cos;
for (int i = 0; i < 90; i++)
{
cos[i] = cosf(float(i) * PI/180.0f);
}
return cos;
}
std::array<float, 180> _cos = init();
}
float cos(float deg)
{
int nearest = int(abs(deg) + 0.5) % 90;
return _cos[nearest];
}
float sin(float deg)
{
return cos(90.0f - deg);
}
}
#endif
请注意,包括您的 cool_math.h 在内的每个翻译单元都有自己的数组 float _cos[180]
和弱函数。要在所有翻译单元之间共享唯一的 float _cos[180]
,您需要将数组和函数定义移动到 cool_math.cc,或者将它们声明为某些 class 的静态成员并定义 float _cos[180]
在 cool_math.cc.
我正在单个头文件中构建快速三角函数逼近。
#ifndef COOL_MATH_H
#define COOL_MATH_H
#include <cmath>
const float PI = std::acos(-1);
namespace trigonometry
{
namespace
{
float _cos[180];
}
void init()
{
for (int i = 0; i < 90; i++)
{
_cos[i] = cosf(float(i) * PI/180.0f);
}
}
float cos(float deg)
{
int nearest = int(abs(deg) + 0.5) % 90;
return _cos[nearest];
}
float sin(float deg)
{
return cos(90.0f - deg);
}
}
#endif
如果我错了请纠正我,但这个近似值理论上比内置三角函数更快?
主要问题是:
如果包含头文件(即只有一次),我如何 运行 函数 trigonometry::init()
?我只想存储 _cos[180]
的值一次。
How can I run the function trigonometry::init() when the header file is included (i.e. only once)?
#ifndef COOL_MATH_H
#define COOL_MATH_H
#include <cmath>
#include <array>
const float PI = std::acos(-1);
namespace trigonometry
{
namespace
{
std::array<float, 180> init()
{
std::array<float, 180> cos;
for (int i = 0; i < 90; i++)
{
cos[i] = cosf(float(i) * PI/180.0f);
}
return cos;
}
std::array<float, 180> _cos = init();
}
float cos(float deg)
{
int nearest = int(abs(deg) + 0.5) % 90;
return _cos[nearest];
}
float sin(float deg)
{
return cos(90.0f - deg);
}
}
#endif
请注意,包括您的 cool_math.h 在内的每个翻译单元都有自己的数组 float _cos[180]
和弱函数。要在所有翻译单元之间共享唯一的 float _cos[180]
,您需要将数组和函数定义移动到 cool_math.cc,或者将它们声明为某些 class 的静态成员并定义 float _cos[180]
在 cool_math.cc.