2015-02-15 3 views
0

Я пытаюсь реализовать файл с отображением памяти, объединив os::MemoryMap и fs::File в каком-то стиле RAII. Рассмотрим следующий пример:«struct field никогда не используется», но необходимо RAII

#![feature(fs, os, io, path, std_misc, core)] 

use std::{io, os, mem, raw}; 
use std::io::{Seek}; 
use std::fs::{File}; 
use std::path::{Path}; 
use std::os::{MemoryMap}; 
use std::borrow::{Cow}; 
use std::error::{FromError}; 
use std::os::unix::{AsRawFd}; 

struct Mmapped { 
    file: File, 
    map: MemoryMap, 
    map_len: usize, 
} 

#[derive(Debug)] 
enum Error { 
    IoError(io::Error), 
    MmapError(os::MapError), 
} 

impl FromError<io::Error> for Error { 
    fn from_error(err: io::Error) -> Error { Error::IoError(err) } 
} 

impl FromError<os::MapError> for Error { 
    fn from_error(err: os::MapError) -> Error { Error::MmapError(err) } 
} 

impl Mmapped { 
    fn new(filename: &str) -> Result<Mmapped, Error> { 
     let mut file = try!(File::open(Path::new(filename))); 
     let map_len = try!(file.seek(io::SeekFrom::End(0))) as usize; 
     let map = try!(MemoryMap::new(map_len, &[os::MapOption::MapReadable, os::MapOption::MapFd(file.as_raw_fd())])); 
     Ok(Mmapped { file: file, map: map, map_len: map_len }) 
    } 

    unsafe fn as_string<'a>(&self) -> Cow<'a, String, str> { 
     String::from_utf8_lossy(mem::transmute(raw::Slice { data: self.map.data() as *const u8, 
                  len: self.map_len })) 
    } 
} 

fn main() { 
    let m = Mmapped::new("test.txt").unwrap(); 
    println!("File contents: {:?}", unsafe { m.as_string() }); 
} 

playpen

Он работает, но компилятор обрабатывает файл поле в Mmapped объекта, как мертвый код:

<anon>:13:5: 13:15 warning: struct field is never used: `file`, #[warn(dead_code)] on by default 
<anon>:13  file: File, 
       ^~~~~~~~~~ 

Могу ли я быть уверен, что это не будет оптимизировать его, и файл будет закрыт в новых метод? И есть ли стандартный способ маркировать мой поле «не мертвый» код?

ответ

2

Вы можете аннотировать конкретное поле, чтобы игнорировать предупреждение мертвых код:

struct Mmapped { 
    #[allow(dead_code)] 
    file: File, 
    map: MemoryMap, 
    map_len: usize, 
} 

Я не верю, что оптимизатор будет полностью отказаться от поля из структуры, и быстрый взгляд на LLVM IR для структуры, которая имеет неиспользуемое поле String, показывает, что для этого поля все еще есть место и даже вызывает клей для этой строки.

8

Я считаю, что идиоматический подход префикса имени поля с _, который также отключить предупреждение:

struct Mmapped { 
    _file: File, 
    map: MemoryMap, 
    map_len: usize, 
} 

Я определенно заметил такую ​​закономерность в стандартном коде библиотеки.

 Смежные вопросы

  • Нет связанных вопросов^_^