On Wednesday, 20 February 2013 at 08:03:48 UTC, Lubos Pintes
wrote:
Hi,
I want to allocate a buffer which I use in a function which
reads data from socket.
So I did as a first line in that function:
static char[] buffer=new char[4096];
The compiler (2.062) complained that it cannot evaluate new
char[] at compile time.
I Then tried to move the declaration before function, the same
thing happened. Allocating statically sized array bloats the
executable.
My idea is to return only a slice of array if less than 4K data
was read and prevent new allocation on every read.
So what I am doing wrong or is this not possible?
Thank.
In D (and unlike C++), anything static MUST have an initial state
that is statically evaluable. "new char[4096]" is a run-time
call, so it cannot be done.
The truth is that this actually isn't much different from C++,
which hides an invisible "is_initialized" bool somewhere to make
it work.
You can try to run-time initialize your buffer the module
constructor, for example. Or just create an accessor to get an
initialized buffer:
void getBuffer() @safe nothrow
{
static char[] buffer;
if (buffer.empty)
buffer = new char[4096];
return buffer;
}