<div dir="ltr">> So, if I understand correctly, your memory is a key-value store where the keys are 257-bit values and the values are arrays of 257-bit values?<br>Both the keys and the values are 257-bits wide:<div><br>- A pointer to an object is 257 bits integer.<br>- The same as a pointer to a field of an object.<div>- And an arbitrary void* is also 257 bits wide integer.<br>- "Hello, world" is an array of 257-bit characters.</div><div><br></div><div>It's indeed redundant for letters and pointers to occupy that much space. However, a realistic contract that is able to run on a virtual machine without exceeding gas limits can't use strings and memory extensively. So we've chosen the simplest implementation possible. If other targets that have non-8-bits byte pack multiple 8-bit characters into a single byte and it's convenient for the community to maintain this kind of design, we probably can reimplement strings this way too.<br><br>Persistent data, which is kept in the blockchain is more compact, but it requires explicit intrinsic calls to deserialize data and then the programmer is able to manipulate with it as with 257-bits integers.</div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Oct 31, 2019 at 1:48 PM David Chisnall <<a href="mailto:David.Chisnall@cl.cam.ac.uk">David.Chisnall@cl.cam.ac.uk</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 31/10/2019 11:17, Dmitriy Borisenkov wrote:<br>
> David, just to clarify a misconception I might have introduced, we do <br>
> not have linear memory in the sense that all data is stored as a trie. <br>
> We do support arrays, structures and GEPs, however, as well as all <br>
> relevant features in C by modeling memory.<br>
<br>
So, if I understand correctly, your memory is a key-value store where <br>
the keys are 257-bit values and the values are arrays of 257-bit values? <br>
  Or they values are 257-bit values?  To help the discussion, please can <br>
you explain how the following are represented:<br>
<br>
  - A pointer to an object.<br>
  - A pointer to a field in an object.<br>
  - An arbitrary void*.<br>
  - The C string "hello world"<br>
<br>
> So regarding concepts of byte, all 5 statements you gave are true for <br>
> our target. Either due to the specification or because of <br>
> performance (gas consumption) issues. But if there are architectures <br>
> that need less from the notion of byte, we should try to figure out the <br>
> common denominator. It's probably ok to be less restrictive about a byte.<br>
<br>
It seems odd to encode a C string as an array of 257-bit values, rather <br>
than as an array of 8-bit values that are stored in 32-char chunks.<br>
<br>
David<br>
</blockquote></div>