Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.34 KB | None | 0 0
  1. #[repr(align(64))]
  2. struct S(u8);
  3.  
  4. #[derive(Clone)]
  5. pub struct Blob {
  6. pub data: BlobData,
  7. pub meta: Meta,
  8. }
  9.  
  10. #[repr(align(64))]
  11. pub struct BlobData([u8; BLOB_SIZE]);
  12.  
  13.  
  14. impl Clone for BlobData {
  15. fn clone(&self) -> Self {
  16. BlobData(self.0)
  17. }
  18. }
  19. impl Default for BlobData {
  20. fn default() -> Self {
  21. BlobData([0u8; BLOB_SIZE])
  22. }
  23. }
  24.  
  25. //auto derive doesn't support large arrays
  26. impl Default for Blob {
  27. fn default() -> Self {
  28. Blob {
  29. data: BlobData::default(),
  30. meta: Meta::default(),
  31. }
  32. }
  33. }
  34.  
  35. pub const BLOB_SIZE: usize = (64 * 1024 - 128); // wikipedia says there should be 20b for ipv4 headers
  36.  
  37. #[derive(Clone, Default, Debug, PartialEq)]
  38. #[repr(C)]
  39. pub struct Meta {
  40. pub size: usize,
  41. pub num_retransmits: u64,
  42. pub addr: [u16; 8],
  43. pub port: u16,
  44. pub v6: bool,
  45. }
  46.  
  47.  
  48. fn main() {
  49. println!("size of S: {}", std::mem::size_of::<S>());
  50. println!("align of S: {}", std::mem::align_of::<S>());
  51. println!("align of Blob: {}", std::mem::align_of::<Blob>());
  52. let mut i = 0;
  53. let mut blobs = vec![];
  54. for i in 0..4096 {
  55. //println!("{:?}", Blob::default().data.0.as_ptr());
  56. let blob = Blob::default();
  57. assert_eq!(blob.data.0.as_ptr() as usize & 63, 0);
  58. blobs.push(blob);
  59. if i & 31 == 0 {
  60. println!("{}...", i);
  61. }
  62.  
  63. }
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement