Quick int pointer allocation question

2012-09-14 Thread monarch_dodra
This is going to be quick: Is it possible to allocate and 
initialize an int in the same line?


int* p = new int(5);

I haven't found a way to 1 liner it. Is it possible?
Do I have to two liner it?

int* p = new int();
*p = 5;

Thanks.


Re: Quick int pointer allocation question

2012-09-14 Thread monarch_dodra

On Friday, 14 September 2012 at 09:20:03 UTC, monarch_dodra wrote:
This is going to be quick: Is it possible to allocate and 
initialize an int in the same line?


int* p = new int(5);

I haven't found a way to 1 liner it. Is it possible?
Do I have to two liner it?

int* p = new int();
*p = 5;

Thanks.


Or dup a pointer to an int for that matter:

int* p1 = ... ;
int* p2 = p1.dup;

?


Re: Quick int pointer allocation question

2012-09-14 Thread David

Whilst I'm on the subject of questions, how does one allocate, but
bypassing the extra memcpy of T.init? Is this possible?


int x = void;

http://dpaste.dzfl.pl/24c1baa9


Re: Quick int pointer allocation question

2012-09-14 Thread Jonathan M Davis
On Friday, September 14, 2012 11:20:16 monarch_dodra wrote:
 This is going to be quick: Is it possible to allocate and
 initialize an int in the same line?
 
 int* p = new int(5);
 
 I haven't found a way to 1 liner it. Is it possible?

Nope. Though I think that it should be.

 Do I have to two liner it?
 
 int* p = new int();
 *p = 5;

Yep. Though I have a pull request which will make it so that you can do

auto p = makeNew!int(5);

https://github.com/D-Programming-Language/phobos/pull/756

- Jonathan M Davis


Re: Quick int pointer allocation question

2012-09-14 Thread monarch_dodra

On Friday, 14 September 2012 at 10:33:47 UTC, David wrote:
Whilst I'm on the subject of questions, how does one allocate, 
but

bypassing the extra memcpy of T.init? Is this possible?


int x = void;

http://dpaste.dzfl.pl/24c1baa9


Hum, but that is a stack allocated variable.

What about:


struct S { }
void main()
{
S* ps = new S(void); //? doesn't work
}

On Friday, 14 September 2012 at 10:37:56 UTC, Jonathan M Davis 
wrote:

On Friday, September 14, 2012 11:20:16 monarch_dodra wrote:

This is going to be quick: Is it possible to allocate and
initialize an int in the same line?

int* p = new int(5);

I haven't found a way to 1 liner it. Is it possible?


Nope. Though I think that it should be.


Do I have to two liner it?

int* p = new int();
*p = 5;


Yep. Though I have a pull request which will make it so that 
you can do


auto p = makeNew!int(5);

https://github.com/D-Programming-Language/phobos/pull/756

- Jonathan M Davis


Thanks. Glad we have a library solution, but that's the kind of 
thing that should work out of the box I think.


Re: Quick int pointer allocation question

2012-09-14 Thread Jacob Carlborg

On 2012-09-14 12:52, monarch_dodra wrote:


int x = void;

http://dpaste.dzfl.pl/24c1baa9


Hum, but that is a stack allocated variable.


Perhaps using GC.malloc?

--
/Jacob Carlborg


Re: Quick int pointer allocation question

2012-09-14 Thread monarch_dodra
On Friday, 14 September 2012 at 11:17:55 UTC, Jacob Carlborg 
wrote:

On 2012-09-14 12:52, monarch_dodra wrote:


int x = void;

http://dpaste.dzfl.pl/24c1baa9


Hum, but that is a stack allocated variable.


Perhaps using GC.malloc?


Hum, apparently, there is a second (default aka-hidden) argument 
that is a bitmask applied to the allocated memory. So not much 
gain there.


I'm allocating an array of 500_000 ulongs, and afterwards, I'm 
initializing them all by hand, making the default allocation 
useless.


I'm not going to lose any sleep over this, but there is no way in 
D to get (garbage collected) un-initialized memory/allocations?


Re: Quick int pointer allocation question

2012-09-14 Thread Steven Schveighoffer
On Fri, 14 Sep 2012 05:20:16 -0400, monarch_dodra monarchdo...@gmail.com  
wrote:


This is going to be quick: Is it possible to allocate and initialize an  
int in the same line?


int* p = new int(5);

I haven't found a way to 1 liner it. Is it possible?
Do I have to two liner it?

int* p = new int();
*p = 5;


int *p = [5].ptr;

-Steve


Re: Quick int pointer allocation question

2012-09-14 Thread monarch_dodra
On Friday, 14 September 2012 at 14:33:51 UTC, Steven 
Schveighoffer wrote:
On Fri, 14 Sep 2012 05:20:16 -0400, monarch_dodra 
monarchdo...@gmail.com wrote:


This is going to be quick: Is it possible to allocate and 
initialize an int in the same line?


int* p = new int(5);

I haven't found a way to 1 liner it. Is it possible?
Do I have to two liner it?

int* p = new int();
*p = 5;


int *p = [5].ptr;

-Steve


Fancy!

Thankyou.


Re: Quick int pointer allocation question

2012-09-14 Thread bearophile

monarch_dodra:


int *p = [5].ptr;

-Steve


But see this benchmark:


void main() {
auto pointers = new int*[1_000_000];
foreach (int i, ref p; pointers)
p = [i].ptr;
foreach (i; 0U .. 4_000_000_000U) {}
}


On my 32 bit system its RAM commit is about 23 MB. The pointers 
array takes about 4 MB. This means each int takes about 19 
bytes of heap RAM instead of 4. Each int allocates some data 
(capacity) to extend the array.


Bye,
bearophile


Re: Quick int pointer allocation question

2012-09-14 Thread Simen Kjaeraas
On Fri, 14 Sep 2012 16:27:55 +0200, monarch_dodra monarchdo...@gmail.com  
wrote:



On Friday, 14 September 2012 at 11:17:55 UTC, Jacob Carlborg wrote:

On 2012-09-14 12:52, monarch_dodra wrote:


int x = void;

http://dpaste.dzfl.pl/24c1baa9


Hum, but that is a stack allocated variable.


Perhaps using GC.malloc?


Hum, apparently, there is a second (default aka-hidden) argument that is  
a bitmask applied to the allocated memory. So not much gain there.


I'm allocating an array of 500_000 ulongs, and afterwards, I'm  
initializing them all by hand, making the default allocation useless.


I'm not going to lose any sleep over this, but there is no way in D to  
get (garbage collected) un-initialized memory/allocations?


What's wrong with GC.malloc? The bitmask is there to... well, many things.
Pass it BlkAttr.NO_SCAN to ensure memory is not initialized. I think that's
all what's needed.

--
Simen


Task management

2012-09-14 Thread Martin Drasar
Hi,

can anyone tell me what is the good (for arbitrary low values of good)
way to forcibly end a running task?

I am using a task pool from std.parallelism to execute delegates
supplied by various plugins. As I have no real control over what gets
executed and how, there is always a possibility that some plugin hangs
for good. This is obviously something that I do not want, so I would
like to know whether there is a way to kill such unresponsive task.

Thanks,
Martin


Re: Quick int pointer allocation question

2012-09-14 Thread Maxim Fomin

On Friday, 14 September 2012 at 09:20:03 UTC, monarch_dodra wrote:
This is going to be quick: Is it possible to allocate and 
initialize an int in the same line?


int* p = new int(5);

I haven't found a way to 1 liner it. Is it possible?
Do I have to two liner it?

int* p = new int();
*p = 5;

Thanks.


Firstly I thought this thread is purely about syntax. However, 
after rereading I think it is about problem of allocation on GC 
heap without default initialization. If I understood it right, 
possible solution is:


struct S
{
   ulong[500_000] array = void;
   void load(ulong value)
   {
  foreach (i, ref ulong v; array)
  {
 array[i] = value;
  }
   }
}

void main()
{
   // int* p = new int, x = ((*p=5) == 5) ? null : null;
   // assert(*p == 5);
   auto s = new S;
   s.load(5);
}


Re: Quick int pointer allocation question

2012-09-14 Thread bearophile

monarch_dodra:

I'm allocating an array of 500_000 ulongs, and afterwards, I'm 
initializing them all by hand, making the default allocation 
useless.


In std.array there are two functions to avoid a double 
initialization, mostly to be used for nonreference data.


Bye,
bearophile


Re: Quick int pointer allocation question

2012-09-14 Thread Chris Cain

On Friday, 14 September 2012 at 18:14:54 UTC, bearophile wrote:

monarch_dodra:

I'm allocating an array of 500_000 ulongs, and afterwards, I'm 
initializing them all by hand, making the default allocation 
useless.


In std.array there are two functions to avoid a double 
initialization, mostly to be used for nonreference data.


Bye,
bearophile


http://dlang.org/phobos/std_array.html#uninitializedArray

and

http://dlang.org/phobos/std_array.html#minimallyInitializedArray


Quick question about new semantics

2012-09-14 Thread monarch_dodra
I have a struct, which defines a constructor that takes an 
argument.


Now, I'd like to new this object, to it's default T.init value 
(eg call new, but now constructors):



struct S
{
this(int);
}

void main()
{
auto p1 = new S;
auto p2 = new S();
}

main.d(8): Error: constructor main.S.this (int) is not callable 
using argument types ()

main.d(8): Error: expected 1 function arguments, not 0
main.d(9): Error: constructor main.S.this (int) is not callable 
using argument types ()

main.d(9): Error: expected 1 function arguments, not 0

Is this a bug? If auto a = S(); is legal, how can auto p = new 
S(); not be?


Re: Quick int pointer allocation question

2012-09-14 Thread monarch_dodra

On Friday, 14 September 2012 at 14:27:43 UTC, monarch_dodra wrote:
On Friday, 14 September 2012 at 11:17:55 UTC, Jacob Carlborg 
wrote:


Perhaps using GC.malloc?


Hum, apparently, there is a second (default aka-hidden) 
argument that is a bitmask applied to the allocated memory. So 
not much gain there.


I'm allocating an array of 500_000 ulongs, and afterwards, I'm 
initializing them all by hand, making the default allocation 
useless.


I'm not going to lose any sleep over this, but there is no way 
in D to get (garbage collected) un-initialized 
memory/allocations?


Never mind, I misread the doc. The bitmask is not memcopied, it 
is actually just a mask of options, so GC works perfectly.


Anybody know what the attribute FINALIZE (Finalize the data in 
this block on collect) means?


On Friday, 14 September 2012 at 18:14:54 UTC, bearophile wrote:

monarch_dodra:

I'm allocating an array of 500_000 ulongs, and afterwards, I'm 
initializing them all by hand, making the default allocation 
useless.


In std.array there are two functions to avoid a double 
initialization, mostly to be used for nonreference data.


Bye,
bearophile
I was looking for those actually, but I was looking in 
std.algorithm...


Thanks


Re: Quick int pointer allocation question

2012-09-14 Thread Steven Schveighoffer
On Fri, 14 Sep 2012 13:03:37 -0400, bearophile bearophileh...@lycos.com  
wrote:



monarch_dodra:


int *p = [5].ptr;

-Steve


But see this benchmark:


void main() {
 auto pointers = new int*[1_000_000];
 foreach (int i, ref p; pointers)
 p = [i].ptr;
 foreach (i; 0U .. 4_000_000_000U) {}
}


On my 32 bit system its RAM commit is about 23 MB. The pointers array  
takes about 4 MB. This means each int takes about 19 bytes of heap RAM  
instead of 4. Each int allocates some data (capacity) to extend the  
array.


That has nothing to do with using array literals -- it has to do with the  
fact that the minimum heap block is 16-bytes (or 4 ints wide).  Extra 3  
bytes is probably for overhead and static data.


If instead of p = [i].ptr; you did p = new int; *p = i;

You would get the same exact behavior.

No way around this, unless you want to do custom allocators.

-Steve


Re: Quick question about new semantics

2012-09-14 Thread Steven Schveighoffer
On Fri, 14 Sep 2012 14:27:56 -0400, monarch_dodra monarchdo...@gmail.com  
wrote:



I have a struct, which defines a constructor that takes an argument.

Now, I'd like to new this object, to it's default T.init value (eg call  
new, but now constructors):



struct S
{
 this(int);
}

void main()
{
 auto p1 = new S;
 auto p2 = new S();
}

main.d(8): Error: constructor main.S.this (int) is not callable using  
argument types ()

main.d(8): Error: expected 1 function arguments, not 0
main.d(9): Error: constructor main.S.this (int) is not callable using  
argument types ()

main.d(9): Error: expected 1 function arguments, not 0

Is this a bug? If auto a = S(); is legal, how can auto p = new S();  
not be?


It is a bug.

http://d.puremagic.com/issues/show_bug.cgi?id=4247

-Steve


Re: Quick int pointer allocation question

2012-09-14 Thread bearophile

Steven Schveighoffer:

it has to do with the fact that the minimum heap block is 
16-bytes
(or 4 ints wide).  Extra 3 bytes is probably for overhead and 
static data.


If instead of p = [i].ptr; you did p = new int; *p = i;

You would get the same exact behavior.

No way around this, unless you want to do custom allocators.


Right, maybe you told me the same thing lot of time ago. Thank 
you for saying such things again. 16 bytes are a lot, so there's 
not a lot of point in creating very small trees nodes :-)


Bye,
bearophile


Re: Quick int pointer allocation question

2012-09-14 Thread Steven Schveighoffer
On Fri, 14 Sep 2012 15:23:40 -0400, monarch_dodra monarchdo...@gmail.com  
wrote:


Anybody know what the attribute FINALIZE (Finalize the data in this  
block on collect) means?


Don't use it.

It specifies that the block is a D class instance, and so has a vtable  
with a finalizer referenced therein.


Obviously an int does not have that.

-Steve


Re: Quick question about new semantics

2012-09-14 Thread Jonathan M Davis
On Friday, September 14, 2012 20:27:56 monarch_dodra wrote:
 I have a struct, which defines a constructor that takes an
 argument.
 
 Now, I'd like to new this object, to it's default T.init value
 (eg call new, but now constructors):
 
 
 struct S
 {
 this(int);
 }
 
 void main()
 {
 auto p1 = new S;
 auto p2 = new S();
 }
 
 main.d(8): Error: constructor main.S.this (int) is not callable
 using argument types ()
 main.d(8): Error: expected 1 function arguments, not 0
 main.d(9): Error: constructor main.S.this (int) is not callable
 using argument types ()
 main.d(9): Error: expected 1 function arguments, not 0
 
 Is this a bug? If auto a = S(); is legal, how can auto p = new
 S(); not be?

Presumably, because it takes a different path in the compiler. S() could be 
treated as a static opCall (certainly, that's how you define a pseudo-default 
constructor on structs), whereas new S() newer would be. However, if anything, 
I'm surprised that

auto s = S();

compiles given that other constructors are defined. But I guess that it just 
always does S.init. There's also a decent chance that the code related to new 
S() is the same for classes which _don't_ have an init value which would ever 
be usable with new (and which definitely disallow new S() if there's no default 
constructor).

I expect that it's a corner case that simply wasn't thought through, and 
arguably it should work. I don't know that the spec says one way or the other 
though (my guess is that it's silent on the matter, since it tends to be 
fairly sparse). Certainly, without allowing that, constructing an S on the 
heap which is S.init is a bit of a pain. It probably requires using either 
emplace or taking the pointer to an element in an array (which would waste 
memory).

I think that there's certainly an argument for allowing what you're trying to 
do.

- Jonathan M Davis