메모리의 한 개 비트로 boolean 값을 표현하는 것에 대한 찬반

nayana의 이미지

메모리의 한 개 비트로 boolean 값을 표현하는 것에 대한 찬반 의견 라는 과제로 레포트가 나왔는데.....항상 1비트로 표현하는것이
당연하다고 생각했었는데...여러분들은 어떻게 생각하시나요?

lacovnk의 이미지

추측입니다만..

어차피 align도 있으니 bit vector로 쓰지 않는한 저장 용량이 줄어들진 않을것 같고

또 기계어 명령어들도 어차피 적어도 byte단위 등등으로 이루어질테니

한개 bit로 다루는 것이 오히려 overload가 걸릴 수도 있을 것 같습니다.

음. 말이 되긴 하나요? ㅎㅎ

purewell의 이미지

lacovnk wrote:
추측입니다만..

어차피 align도 있으니 bit vector로 쓰지 않는한 저장 용량이 줄어들진 않을것 같고

또 기계어 명령어들도 어차피 적어도 byte단위 등등으로 이루어질테니

한개 bit로 다루는 것이 오히려 overload가 걸릴 수도 있을 것 같습니다.

음. 말이 되긴 하나요? ㅎㅎ

머리넘김이가 아닐까 살째기 딴죽을 걸어봅니다. 으헤헤헤헤~*

_____________________________
언제나 맑고픈 샘이가...
http://purewell.biz

serialx의 이미지

사실 생각해보면 메모리 비트 하나를 다룰려면 힘들지 않나요?

TEST EAX, EAX 하던거를

MOV EBX, EAX
AND EBX, 00..0100
SHR EBX, 2
TEST EBX, EBX

어셈 코드가 전혀 틀린거지만.. 암튼 이런식으로 다뤄야 하지 않습니까?

좀 비 효율적인거 같습니다. Processor Time 보단 MEmory 가 더 싸지 않나요;; =3

정태영의 이미지

serialx wrote:
사실 생각해보면 메모리 비트 하나를 다룰려면 힘들지 않나요?

cpu 마다 다릅니다... 8051 같은 소형 마이크로 칩의 경우엔 비트단위로 접근하는게 가능합니다 :)

상황마다 다른거겠죠

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

sDH8988L의 이미지

아무래도 Bit로 Boolean을 표현하는 건 여러모로 이득이 없다고 봅니다.

1 Bit로 Boolean을 표기한다고 해도 이득이랄 수 있는 건 Memory 용량을 줄여주는 효과 뿐인데요... 아무리 1 Bit이라고 해도 Memory Latency는 동일합니다. 그리고 Boolean을 사용하는 빈도수가 많지 않다면, Memory를 줄여주는 효과는 거의 없겠지요...

그 대신 단점은 너무나도 명확합니다...
보통 Memory를 Access할 때는 Byte 단위로 하죠... 머... 여러 가지 Access Mode가 있습니다만, 별 효과도 없는 일로 Memory Access Mode를 늘리는 건 CPU의 복잡도를 늘리는 것 밖에 안됩니다.

물론, 좀 다른 방법을 사용해서 기존의 구조를 바꾸지 않고 할 수 있는 방법도 있겠지만, 그렇게 하면 Data에서 줄어드는 Memory가 Instruction 부분에서 늘어날 겁니다... 그렇게 되면 이득이 없죠...

IsExist의 이미지

CPU는 워드 단위로 에세스 하지 않나요?

CPU에 따라 32비트 워드, 16비트 워드, 64비트 워드

인텔계열에서는 워드는 16비트를 주로 의미 하지만서도.

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

정태영의 이미지

sDH8988L wrote:
아무래도 Bit로 Boolean을 표현하는 건 여러모로 이득이 없다고 봅니다.

1 Bit로 Boolean을 표기한다고 해도 이득이랄 수 있는 건 Memory 용량을 줄여주는 효과 뿐인데요... 아무리 1 Bit이라고 해도 Memory Latency는 동일합니다. 그리고 Boolean을 사용하는 빈도수가 많지 않다면, Memory를 줄여주는 효과는 거의 없겠지요...

그 대신 단점은 너무나도 명확합니다...
보통 Memory를 Access할 때는 Byte 단위로 하죠... 머... 여러 가지 Access Mode가 있습니다만, 별 효과도 없는 일로 Memory Access Mode를 늘리는 건 CPU의 복잡도를 늘리는 것 밖에 안됩니다.

물론, 좀 다른 방법을 사용해서 기존의 구조를 바꾸지 않고 할 수 있는 방법도 있겠지만, 그렇게 하면 Data에서 줄어드는 Memory가 Instruction 부분에서 늘어날 겁니다... 그렇게 되면 이득이 없죠...

http://en.wikipedia.org/wiki/AVR_instruction_set
http://www.8052.com/51jb.phtml

우선 위의 url 등을 보시면 소형 마이크로 cpu 중에선 bit 관련 인스트럭션이 있는 경우도 있기 때문에... 꼭 비효율적인건 아닙니다 :)

사용빈도가 높다면... pentium 등의 경우라도 cache 의 hit ratio 에 영향을 끼쳐 더 비슷한 성능을 나타낼 수도 있지 않을까 싶습니다... (아무래도 캐쉬에 더 많은 flag 가 존재할 수 있지 않을까 싶은 생각이 들어서;; 다만 뽑기겠군요; )

뭐 하튼 이래저래 생각해보면 상황에 맞게 사용하면 되는게 아닐까 싶지만... 요새 메모리가 워낙 싸다보니 pc 에선 메모리 걱정하면서 프로그래밍할 일이 없어져가고 있는 듯 싶네요;; embedded 쪽이 아니라면요... 오래된 책들을 보면 union 등을 사용해서 메모리 사용을 줄이는 삽질하고 그런 기록들도 있던데...

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

maja의 이미지

오직 테스트만이 살길입니다.

lifthrasiir의 이미지

8051 같은 거라면 충분히 쓸 만 합니다. 아예 비트 단위로 접근하는 레지스터가 있더군요. -,.- 하지만 그런 용도에 쓰는 게 아니라면, 그리고 bit flag 같은 걸 나타내기 위해서 쓰는 게 아니라면 (즉 compact하게 나타내야 하는 게 아니라면) 1바이트에 boolean 하나 식으로 넣는 게 더 이익이라고 생각합니다.

- 토끼군

honeamis의 이미지

8051 과 같이 실제로는 레지스터에 매핑되는 영역에 대해서는 1비트 연산도 그럭저럭 참을만 합니다만, 동일 프로세서에서도 외부메모리 영역은 1비트 연산을 위해 read-modify-write 를 해야하는 것은 변함이 없으니 그때 그때 달라요라고 하는 편이 낫지 않을까요? 게다가 메모리 입장에서는 1비트 연산이나 word 연산이나 거기서 거깁니다.

민법 제 2 조 제 2 항 - 권리는 남용하지 못한다.

오리주둥이의 이미지

purewell wrote:
lacovnk wrote:
추측입니다만..

어차피 align도 있으니 bit vector로 쓰지 않는한 저장 용량이 줄어들진 않을것 같고

또 기계어 명령어들도 어차피 적어도 byte단위 등등으로 이루어질테니

한개 bit로 다루는 것이 오히려 overload가 걸릴 수도 있을 것 같습니다.

음. 말이 되긴 하나요? ㅎㅎ

머리넘김이가 아닐까 살째기 딴죽을 걸어봅니다. 으헤헤헤헤~*

타격을 주되 예의바르고 기분 나쁘지 않게..
이런 능력을 가진 주둥이가 되려면 전 아직 먼것 같습니다.
부럽.. ㅜ.ㅡ

죠커의 이미지

IsExist wrote:
CPU는 워드 단위로 에세스 하지 않나요?

CPU에 따라 32비트 워드, 16비트 워드, 64비트 워드

인텔계열에서는 워드는 16비트를 주로 의미 하지만서도.

워드 단위로만 억세스할 수 있는 하드웨어가 있습니다. 그런 경우 char 자료형 구조도 여기서 말한 1비트 boolean 형 처럼 부자연스러운 존재죠.

다행히 우리는 워드 단위의 억세스가 가장 비용이 적은 하드웨어를 사용하고 있고 byte 단위의 boolean이나 워드 단위의 boolean을 쓰는 것이 적당하다고 생각합니다.

ed.netdiver의 이미지

bit masking table을 만들어두고 각종 branch를 전역 table참조로 때워버리는 programming이 있긴 하죠.
대충 and연산과 비교연산 opcode정도만으로 가능하기 때문에 memory size가 극히 작아 변수 저장뿐만 아니라 opcode 영역도 충분하지 않은 micom programming쪽에서 쓰는 방식입니다...라기보단, 그렇게 짜기도 했었다는 게 맞는 표현이겠네요.
overflow bit 가지고도 그런 식의 삽질을 하곤 했던...ㅋㅋ
아, 램상주프로그램 만들때도 메모리쫌 덜써보겠다고 저러지 않나?...

예전 꽁수중에는 gate사용을 줄이기 위해 digital signal line에 series로 cap을 달아 쓰는 방법도 있었습니다.
이러면, cap에 charge/discharge되는 그 짧은 시정수동안의 delay를 줄수 있어, 그걸 마치 timing chart상의 logic 0/1로 이용해먹는겁니다.
그러고 보면, 예전 AT보다 많은 메모리로 그보다 훨 빠른 clock에 사용하는 것이니, 환경면에선 boolean을 bit로 할당할 이유야 거의 없어지지 않았나 싶긴 합니다.
(하긴, 모르긴 몰라도, 지금도 저런 삽질중인 분들도 여전히 건재하시지 않을지...)
:D

--------------------------------------------------------------------------------
\(´∇`)ノ \(´∇`)ノ \(´∇`)ノ \(´∇`)ノ
def ed():neTdiVeR in range(thEeArTh)

aquz의 이미지

메모리절약을 목표로 한다면 1비트가 당연한 듯...
속도를 목표로 한다면,
CPU보다 메모리에서 병목현상이 발생하니,
기기에 따라서,
1비트보다 64비트가 메모리속도가 빨라진다면,
64비트 단위로 저장해야 할 것 같아요.

논리값 1~64개를 묶어서 저장하는 방법도...

ydhoney의 이미지

1. cpu마다 다르다. 일반적으로는 그렇게 짜기 힘든것도 있고..
하지만 그렇게 해왔으므로 꾸준히 그렇게 한다. 괜히 남이 안하던 짓 하면 혼나니까..

2. 개구리 바안찬~

cronex의 이미지

aquz wrote:
메모리절약을 목표로 한다면 1비트가 당연한 듯...
속도를 목표로 한다면,
CPU보다 메모리에서 병목현상이 발생하니,
기기에 따라서,
1비트보다 64비트가 메모리속도가 빨라진다면,
64비트 단위로 저장해야 할 것 같아요.

논리값 1~64개를 묶어서 저장하는 방법도...


시스템에서 1비트 연산을 지원안하면 실제로 메모리 절약이 되질 않습니다.
만약 비트 연산이 지원되지 않는 시스템에서 bit가 저장된 위치를 알려면 메모리상의 위치+bit mask까지 필요합니다.
결국 boolean에 대한 연산을 하려면 그 변수에 대한 mask등을 이용해서 비트연산을 해야 하므로 해당 비트를 추출해내는데 필요한 mask에 대한 저장공간까지 필요하죠.

만약 64개까지의 비트값을 묶어서 저장한다고 하더라도 그건 컴파일러 수준이 아니라 사용자가 직접 코딩해줘야 하는 부분이 되겠죠.
컴파일러 수준에서 처리해주면 위와 같은 코딩은 메모리 공간도 절약되지 않고 속도도 도리어 더 늦어진다고 봅니다.

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

정태영의 이미지

cronex wrote:
만약 비트 연산이 지원되지 않는 시스템에서 bit가 저장된 위치를 알려면 메모리상의 위치+bit mask까지 필요합니다.
결국 boolean에 대한 연산을 하려면 그 변수에 대한 mask등을 이용해서 비트연산을 해야 하므로 해당 비트를 추출해내는데 필요한 mask에 대한 저장공간까지 필요하죠.

구지 저장해놓지 않아도 ... 원한다면야 shift 연산으로 bit mask 는 간단하게 만들 수 있습니다 :)

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

cronex의 이미지

정태영 wrote:
cronex wrote:
만약 비트 연산이 지원되지 않는 시스템에서 bit가 저장된 위치를 알려면 메모리상의 위치+bit mask까지 필요합니다.
결국 boolean에 대한 연산을 하려면 그 변수에 대한 mask등을 이용해서 비트연산을 해야 하므로 해당 비트를 추출해내는데 필요한 mask에 대한 저장공간까지 필요하죠.

구지 저장해놓지 않아도 ... 원한다면야 shift 연산으로 bit mask 는 간단하게 만들 수 있습니다 :)


음 물론 bit mask야 만드는 건 쉽겠지만 특정 boolean 값이 어느 bit에 저장되어있는지를 일일이 기억할 수 없으므로
결국 boolean 값 하나 대한 bit mask가 꼭 하나가 존재해야 하는거 아닐까요?
물론 이 bit연산을 프로그래머가 직접 인지하고 하는 것이라면 정태영님이 말씀하신대로 하면 되겠지만
제가 말한 부분은 컴파일러가 처릴할 때...의 얘기입니다.
실제로 boolean값을 어떻게 처리하냐의 문제는 프로그래머의 손을 떠난 컴파일러 단계의 얘기이죠.

------------------------------------------------------------
이 멍청이~! 나한테 이길 수 있다고 생각했었냐~?
광란의 귀공자 데코스 와이즈멜 님이라구~!

정태영의 이미지

cronex wrote:
실제로 boolean값을 어떻게 처리하냐의 문제는 프로그래머의 손을 떠난 컴파일러 단계의 얘기이죠.

아 C++ 에서같은 BOOL 타입 얘기셨나보군요... :)

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.