plasma_effectのメモ帳的ブログのようなsomething
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ http://t.co/7Fa2usFRBz コンパイル時に512要素のマージソート、通った。しかしもはやコードが正しくても通るかどうかは処理系のポテンシャルに拠る…。
— 蔵人紗音のじ (@fimbul11) 2014, 7月 6
constexpr evaluation hit maximum step limit; で死ぬ。要素数が増えれば再帰深度を抑えないとダメだし、再帰深度を抑えるためには往々にして遠回りな実装になってステップ数が増えるし、このエラーはもう詰みかなって感じある。
— 蔵人紗音のじ (@fimbul11) 2014, 7月 6
まぁidiomとか色々発達した結果、スタックオーバーフローさせずに再帰だけでステップ数の上限叩けるようになったのは一定の成果なんじゃないですかね…。
— 蔵人紗音のじ (@fimbul11) 2014, 7月 6
お前は何を言っているんだ感がすごい漂うが、コンパイル時に512要素のマージソートの話。C++11の規格でconstexprは再帰深度が云々って話なので再帰深度オーダーがO(N)だとダメなわけで。で、とりあえず整列済みの2つの配列をマージさせる関数を書いたわけですが。
gccだとメモリ食いつぶした [Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ http://t.co/aW4tzzOjN2
— plasma_effect (@plasma_effector) 2014, 7月 6
もうちょっとチューンしたらメモリ効率よくなるか知らないがそもそも上であるようにconstexprのステップ数上限に引っかかってるのでどうしようもなかったりする。ステップ数はどんな実装でも平等に増えていくし。
#include<sprout/array.hpp>
#include<utility>
template<class T,std::size_t N,std::size_t M>
constexpr sprout::array<T,N+M> array_merge(
sprout::array<T,N> const& A,
sprout::array<T,M> const& B)
{
sprout::array<T,N+M> ret{};
int a=0;
int b=0;
for(std::size_t i=0;i<N+M;++i)
{
if(a==N)
{
ret[i]=B[b];
++b;
}
else if(b==M)
{
ret[i]=A[a];
++a;
}
else if(A[a]<B[b])
{
ret[i]=A[a];
++a;
}
else
{
ret[i]=B[b];
++b;
}
}
return ret;
}
constexpr sprout::array<int,8> x = {{0,2,4,6,8,10,12,14}};
constexpr sprout::array<int,8> y = {{1,3,5,7,9,11,13,15}};
constexpr auto z = array_merge(x,y);
#include<iostream>
int main()
{
for(auto i:z)
std::cout<<i<<std::endl;
}
カレンダー
カテゴリー
フリーエリア
最新CM
最新記事
プロフィール
ブログ内検索
P R