- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有以下功能:
double
neville (double xx, size_t n, const double *x, const double *y, double *work);
它使用 x
和 y
中存储的 n
点在 xx
处执行拉格朗日插值。 work
数组的大小为 2 * n
。由于这是多项式插值,n
大约在 ~5 左右,很少超过 10。
此函数经过积极优化,应该在紧密循环中调用。分析表明,堆在循环中分配工作数组是错误的。不幸的是,我应该将其打包到一个类似函数的类中,而客户一定不知道工作数组。
现在,我为度数和 std::array
使用模板整数参数,以避免动态分配 work
数组:
template <size_t n>
struct interpolator
{
double operator() (double xx) const
{
std::array<double, 2 * n> work;
size_t i = locate (xx); // not shown here, no performance impact
// due to clever tricks + nice calling patterns
return neville (xx, n, x + i, y + i, work.data ());
}
const double *x, *y;
};
本来可以将工作数组存储为类的可变成员,但 operator()
应该由多个线程同时使用。只要您在编译时知道 n
,这个版本就可以。
现在,我需要在运行时指定 n
参数。我想知道这样的事情:
double operator() (double xx) const
{
auto work = static_cast<double*> (alloca (n * sizeof (double)));
...
使用 alloca
时有些警示:我当然要对 n
设置一个上限以避免 alloca
调用溢出(反正使用100次多项式插值是很愚蠢的)。
不过,我对这种方法感到很不自在:
alloca
的一些明显危险?最佳答案
I'm quite unconfortable with the approach however:
- Am I missing some obvious danger of alloca ?
您指出了一个真正的危险:alloca
的堆栈溢出行为未定义。此外,alloca
实际上并未标准化。例如,Visual C++ 有 _alloca
而不是 GCC by default defines it as a macro .然而,通过围绕少数现有实现提供一个薄包装器,可以很容易地规避这个问题。
- Is there a better way to avoid heap allocation here ?
不是真的。 C++14 将有一个(可能!)堆栈分配的可变长度数组类型。但在那之前,当您认为 std::array
不适合时,请在像您这样的情况下使用 alloca
。
虽然有点挑剔:您的代码缺少 alloca
返回值的转换。它甚至不应该编译。
关于c++ - 这是使用 alloca 的好理由吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16306852/
您好,我希望我的下一个输出(在本例中就是字母)在上一个输出之后输出 8 个空格。这适用于第一个字符,但之后的 printf 语句不起作用。它在第一个 printf 语句之后立即打印,我试图将其设置为
我想知道制作 std::list<>::splice 背后的基本原理是什么使引用被拼接到新容器中的子序列的迭代器无效。这对我来说有点不合逻辑,尤其是考虑到标准 std::container::swap
谁能告诉我为什么我应该使用 Azure Function 输出绑定(bind)(例如 SendGrid 或 Twilio)而不是仅仅在我的 C# 函数中显式使用适当的 SDK(例如 Sendgrid
我们在当前项目中使用 React 和 TypeScript,我遇到了以下行为。 import React, { Component } from 'react'; 我将上面的行替换为下面的行,因为它似
我是一名优秀的程序员,十分优秀!